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!'),
),
);
}
}
注意事项
- iOS 支持:该项目使用 Swift 实现 iOS 支持,请确保您的项目已启用 Swift 支持。
- Android 支持:对于 SDK > 27 的设备,需要在
AndroidManifest.xml
中添加<application android:usesCleartextTraffic="true" />
。 - 测试:运行集成测试时,可以使用以下命令:
sh bin/run_tests.sh
更多关于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);
}
}