Flutter实时通信插件adhara_socket_io的使用

Flutter实时通信插件adhara_socket_io的使用

adhara_socket_io 是一个用于 Flutter 的实时通信插件,基于 socket.io 技术栈。它支持 Android 和 iOS 平台,并且兼容 socket.io 版本 v2。目前开发工作正在进行中,以支持 v3 和 v4。

功能特点

  • 支持多种传输方式(如 WebSocket 和 Polling)。
  • 可通过事件监听接收服务器推送的数据。
  • 支持消息发送与确认(ACK)机制。
  • 提供详细的日志记录功能。

使用步骤

1. 添加依赖

pubspec.yaml 文件中添加以下依赖:

dependencies:
  adhara_socket_io: ^1.0.0

然后执行 flutter pub get 安装依赖。

2. 初始化 Socket 实例

创建一个 SocketIOManager 实例并配置连接参数:

import 'package:adhara_socket_io/adhara_socket_io.dart';

final SOCKET_SERVER = 'http://192.168.1.2:7070/'; // 修改为你的服务器地址
SocketIO socket;

Future<void> demonstrateSocket() async {
  // 创建 Socket 实例
  socket = await SocketIOManager().createInstance(
    SocketOptions(
      SOCKET_SERVER,
      namespace: '/', // 默认命名空间
      query: {
        'auth': '--SOME AUTH STRING---',
        'info': 'new connection from adhara-socketio',
        'timestamp': DateTime.now().toString(),
      },
      enableLogging: true, // 启用日志记录
      transports: [Transports.webSocket], // 使用 WebSocket 作为传输方式
    ),
  );
}
3. 监听事件

可以通过 onConnect, onError, onDisconnect 等方法监听不同的事件:

// 监听连接成功事件
subscription = socket.onConnect.listen((data) {
  print('connected: $data');
  socket.emit('message', ['Hello world!']); // 发送消息到服务器
});

// 监听自定义事件(例如 "echo")
echoSubscription = socket.on('echo').listen((data) {
  print("event received with data: $data");
});
4. 连接服务器

有两种方式可以连接到服务器:

  • 普通模式:不等待连接结果。
  • 同步模式:确保连接成功或抛出错误。

普通模式:

await socket.connect();

同步模式:

await socket.connectSync();
5. 发送消息

可以使用 emit 方法向服务器发送消息:

await socket.emit('echo', ['hello']);

如果需要确认消息是否送达,可以使用 emitWithAck 方法:

dynamic ackData = await socket.emitWithAck('echo', ['hello']);
print('acknowledgement received from server: $ackData');
6. 断开连接

完成通信后,记得释放资源:

await echoSubscription.cancel(); // 取消订阅
await connectSubscription.cancel();
await SocketIOManager().clearInstance(socket); // 清理 Socket 实例

完整示例代码

以下是一个完整的示例代码,展示了如何使用 adhara_socket_io 插件进行实时通信:

import 'dart:convert';

import 'package:adhara_socket_io/adhara_socket_io.dart';
import 'package:flutter/material.dart';

void main() => runApp(MyApp());

const uri = 'http://192.168.0.105:7070/';

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: SocketExample(),
    );
  }
}

class SocketExample extends StatefulWidget {
  @override
  _SocketExampleState createState() => _SocketExampleState();
}

class _SocketExampleState extends State<SocketExample> {
  SocketIOManager manager;
  SocketIO socket;

  @override
  void initState() {
    super.initState();
    manager = SocketIOManager();
    connectSocket();
  }

  Future<void> connectSocket() async {
    socket = await manager.createInstance(
      SocketOptions(
        uri,
        namespace: '/',
        query: {
          'auth': '--SOME AUTH STRING---',
          'info': 'new connection from adhara-socketio',
          'timestamp': DateTime.now().toString(),
        },
        enableLogging: true,
        transports: [Transports.webSocket],
      ),
    );

    socket.onConnect.listen((data) {
      print('connected: $data');
      socket.emit('message', ['Hello world!']);
    });

    socket.on('echo').listen((data) {
      print("event received with data: $data");
    });

    await socket.connectSync();
  }

  @override
  void dispose() {
    socket.dispose();
    manager.clearInstance(socket);
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Adhara Socket.IO Example'),
      ),
      body: Center(
        child: Text('Socket Connected!'),
      ),
    );
  }
}

注意事项

  1. iOS 支持:该项目使用 Swift 实现 iOS 支持,请确保您的项目已启用 Swift 支持。
  2. Android 支持:对于 SDK > 27 的设备,需要在 AndroidManifest.xml 中添加 <application android:usesCleartextTraffic="true" />
  3. 测试:运行集成测试时,可以使用以下命令:
    sh bin/run_tests.sh
1 回复

更多关于Flutter实时通信插件adhara_socket_io的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html


adhara_socket_io 是一个用于 Flutter 的 Socket.IO 插件,它允许你在 Flutter 应用中实现实时通信。Socket.IO 是一个基于 WebSocket 的实时通信库,支持双向通信,适用于聊天应用、实时通知、在线游戏等场景。

以下是如何在 Flutter 项目中使用 adhara_socket_io 插件的步骤:

1. 添加依赖

首先,在 pubspec.yaml 文件中添加 adhara_socket_io 依赖:

dependencies:
  flutter:
    sdk: flutter
  adhara_socket_io: ^0.4.1

然后运行 flutter pub get 来安装依赖。

2. 初始化 Socket.IO 连接

在你的 Dart 文件中,导入 adhara_socket_io 并初始化 Socket.IO 连接。

import 'package:adhara_socket_io/adhara_socket_io.dart';

class SocketService {
  SocketIOManager manager;
  SocketIO socket;

  Future<void> initSocket() async {
    manager = SocketIOManager();
    socket = await manager.createInstance(SocketOptions(
      'http://your-server-url', // 替换为你的服务器地址
      enableLogging: true,
      transports: [Transports.WEB_SOCKET], // 使用 WebSocket 传输
    ));

    // 监听连接事件
    socket.onConnect((data) {
      print("Connected to server");
    });

    // 监听断开连接事件
    socket.onDisconnect((data) {
      print("Disconnected from server");
    });

    // 监听自定义事件
    socket.on("message", (data) {
      print("Received message: $data");
    });

    // 连接到服务器
    socket.connect();
  }

  void sendMessage(String message) {
    socket.emit("message", [message]);
  }

  void disconnect() {
    if (socket != null) {
      manager.clearInstance(socket);
    }
  }
}

3. 使用 SocketService

在你的 Flutter 应用中,使用 SocketService 来管理 Socket.IO 连接。

import 'package:flutter/material.dart';
import 'socket_service.dart';

void main() {
  runApp(MyApp());
}

class MyApp extends StatelessWidget {
  @override
  Widget build(BuildContext context) {
    return MaterialApp(
      home: HomePage(),
    );
  }
}

class HomePage extends StatefulWidget {
  @override
  _HomePageState createState() => _HomePageState();
}

class _HomePageState extends State<HomePage> {
  SocketService _socketService = SocketService();
  TextEditingController _controller = TextEditingController();

  @override
  void initState() {
    super.initState();
    _socketService.initSocket();
  }

  @override
  void dispose() {
    _socketService.disconnect();
    super.dispose();
  }

  @override
  Widget build(BuildContext context) {
    return Scaffold(
      appBar: AppBar(
        title: Text('Socket.IO Example'),
      ),
      body: Padding(
        padding: const EdgeInsets.all(16.0),
        child: Column(
          children: [
            TextField(
              controller: _controller,
              decoration: InputDecoration(labelText: 'Enter a message'),
            ),
            SizedBox(height: 16),
            ElevatedButton(
              onPressed: () {
                _socketService.sendMessage(_controller.text);
                _controller.clear();
              },
              child: Text('Send Message'),
            ),
          ],
        ),
      ),
    );
  }
}

4. 运行应用

运行你的 Flutter 应用,你应该能够连接到 Socket.IO 服务器,并发送和接收消息。

5. 处理其他事件

你可以根据需要监听和处理其他事件,例如错误事件、重连事件等。

socket.onError((data) {
  print("Error: $data");
});

socket.onReconnect((data) {
  print("Reconnected to server");
});

6. 断开连接

在应用退出或不再需要连接时,记得断开连接以释放资源。

void disconnect() {
  if (socket != null) {
    manager.clearInstance(socket);
  }
}
回到顶部
AI 助手
你好,我是IT营的 AI 助手
您可以尝试点击下方的快捷入口开启体验!