Flutter实时通信插件signalr_client的使用
Flutter实时通信插件signalr_client的使用
signalr_client
一个用于Flutter的ASP.NET Core SignalR客户端。ASP.NET Core SignalR 是一个开源库,它简化了为应用程序添加实时web功能的过程。实时web功能使服务器端代码能够即时向客户端推送内容。
该客户端能够调用服务器端的Hub函数(包括流式函数)并接收来自服务器的方法调用。
支持的传输协议
- WebSocket
- Service Side Events
- Long Polling
支持的Hub协议
- Json
- MessagePack - 由于找不到支持当前Flutter版本的MessagePack库。
示例
聊天客户端/服务器
- Chat client/server - 一个简单的客户端/服务器聊天应用。
集成测试应用
- Integration test app - 查看客户端如何调用各种类型的Hub函数。
开始使用
在 pubspec.yaml
文件中添加 signalr_client
依赖:
dependencies:
flutter:
sdk: flutter
signalr_client:
使用方法
以下是一些基本用法的示例:
1. 创建Hub连接
// 导入库。
import 'package:signalr_client/signalr_client.dart';
// SignalR服务器的位置。
final serverUrl = "192.168.10.50:51001";
// 使用HubConnectionBuilder创建连接。
final hubConnection = HubConnectionBuilder().withUrl(serverUrl).build();
// 当连接关闭时,在控制台打印消息。
hubConnection.onclose((error) => print("Connection Closed"));
日志记录
通过dart的 logging
包支持日志记录:
// 导入这些库。
import 'package:logging/logging.dart';
import 'package:signalr_client/signalr_client.dart';
// 配置日志记录。
Logger.root.level = Level.ALL;
// 将日志消息写入控制台。
Logger.root.onRecord.listen((LogRecord rec) {
print('${rec.level.name}: ${rec.time}: ${rec.message}');
});
// 如果只想记录更高层级的Hub协议消息:
final hubProtLogger = Logger("SignalR - hub");
// 如果还想记录传输消息:
final transportProtLogger = Logger("SignalR - transport");
// SignalR服务器的位置。
final serverUrl = "192.168.10.50:51001";
// 配置Http连接选项。
final httpOptions = new HttpConnectionOptions(logger: transportProtLogger);
// 使用WebSocket作为默认传输类型。
// final httpOptions = new HttpConnectionOptions(logger: transportProtLogger, transport: HttpTransportType.WebSockets);
// 使用Server-Sent Events作为传输类型。
// final httpOptions = new HttpConnectionOptions(logger: transportProtLogger, transport: HttpTransportType.ServerSentEvents);
// 使用长轮询作为传输类型。
// final httpOptions = new HttpConnectionOptions(logger: transportProtLogger, transport: HttpTransportType.LongPolling);
// 如果需要授权Hub连接,请提供返回令牌字符串的异步回调函数(参见AccessTokenFactory typedef),并将其分配给accessTokenFactory参数:
// final httpOptions = new HttpConnectionOptions(... accessTokenFactory: () async => await getAccessToken());
// 使用HubConnectionBuilder创建连接。
final hubConnection = HubConnectionBuilder()
.withUrl(serverUrl, options: httpOptions)
.configureLogging(hubProtLogger)
.build();
// 当连接关闭时,在控制台打印消息。
hubConnection.onclose((error) => print("Connection Closed"));
2. 连接到Hub
调用以下方法开始握手并连接到SignalR服务器:
await hubConnection.start();
3. 调用Hub函数
假设存在以下Hub函数:
public string MethodOneSimpleParameterSimpleReturnValue(string p1)
{
Console.WriteLine($"'MethodOneSimpleParameterSimpleReturnValue' invoked. Parameter value: '{p1}");
return p1;
}
客户端可以通过以下方式调用该函数:
final result = await hubConnection.invoke("MethodOneSimpleParameterSimpleReturnValue", args: <Object>["ParameterValue"]);
logger.log(LogLevel.Information, "Result: '$result'");
4. 调用客户端函数
假设服务器调用了一个名为 “aClientProvidedFunction” 的函数:
await Clients.Caller.SendAsync("aClientProvidedFunction", null);
客户端可以这样提供该函数:
hubConnection.on("aClientProvidedFunction", _handleAClientProvidedFunction);
// 注销该函数:
// a) 注销特定实现:
// hubConnection.off("aClientProvidedFunction", method: _handleServerInvokeMethodNoParametersNoReturnValue);
// b) 注销所有实现:
// hubConnection.off("aClientProvidedFunction");
void _handleAClientProvidedFunction(List<Object> parameters) {
logger.log(LogLevel.Information, "Server invoked the method");
}
更多关于Flutter实时通信插件signalr_client的使用的实战教程也可以访问 https://www.itying.com/category-92-b0.html
更多关于Flutter实时通信插件signalr_client的使用的实战系列教程也可以访问 https://www.itying.com/category-92-b0.html
signalr_client
是一个用于在 Flutter 应用中实现与 SignalR 服务器进行实时通信的插件。SignalR 是一个由微软开发的实时通信库,它支持多种传输协议(如 WebSocket、Server-Sent Events 和长轮询),并能够自动选择最佳传输方式。
以下是如何在 Flutter 项目中使用 signalr_client
插件的步骤:
1. 添加依赖
首先,在 pubspec.yaml
文件中添加 signalr_client
依赖:
dependencies:
flutter:
sdk: flutter
signalr_client: ^1.0.0
然后运行 flutter pub get
来获取依赖。
2. 导入包
在需要使用 SignalR 的 Dart 文件中导入 signalr_client
包:
import 'package:signalr_client/signalr_client.dart';
3. 创建 SignalR 连接
接下来,你可以创建一个 SignalR 连接并连接到服务器。以下是一个简单的示例:
void connectToSignalR() async {
// 创建 HubConnectionBuilder
final hubConnection = HubConnectionBuilder()
.withUrl('https://your-signalr-server-url/hub')
.build();
// 监听连接状态变化
hubConnection.onclose((error) {
print('Connection closed: $error');
});
// 连接到服务器
await hubConnection.start();
// 监听服务器发送的消息
hubConnection.on('ReceiveMessage', (List<dynamic>? arguments) {
if (arguments != null && arguments.isNotEmpty) {
print('Received message: ${arguments[0]}');
}
});
// 发送消息到服务器
hubConnection.invoke('SendMessage', args: ['Hello, SignalR!']);
}
4. 处理连接状态
你可以通过 onclose
方法来处理连接关闭的情况,并在需要时重新连接。
5. 发送和接收消息
使用 hubConnection.invoke
方法可以向服务器发送消息,而使用 hubConnection.on
方法可以监听服务器发送的消息。
6. 断开连接
当你不再需要连接时,可以调用 hubConnection.stop()
来断开连接:
void disconnectFromSignalR() async {
await hubConnection.stop();
}
7. 处理错误
你可以通过 hubConnection.onclose
方法来处理连接关闭时的错误,并在需要时进行重连或其他操作。
8. 完整示例
以下是一个完整的示例,展示了如何连接、发送和接收消息,以及处理连接关闭:
import 'package:flutter/material.dart';
import 'package:signalr_client/signalr_client.dart';
void main() {
runApp(MyApp());
}
class MyApp extends StatelessWidget {
[@override](/user/override)
Widget build(BuildContext context) {
return MaterialApp(
home: SignalRExample(),
);
}
}
class SignalRExample extends StatefulWidget {
[@override](/user/override)
_SignalRExampleState createState() => _SignalRExampleState();
}
class _SignalRExampleState extends State<SignalRExample> {
late HubConnection hubConnection;
[@override](/user/override)
void initState() {
super.initState();
connectToSignalR();
}
void connectToSignalR() async {
hubConnection = HubConnectionBuilder()
.withUrl('https://your-signalr-server-url/hub')
.build();
hubConnection.onclose((error) {
print('Connection closed: $error');
// 可以在这里实现重连逻辑
});
await hubConnection.start();
hubConnection.on('ReceiveMessage', (List<dynamic>? arguments) {
if (arguments != null && arguments.isNotEmpty) {
print('Received message: ${arguments[0]}');
}
});
hubConnection.invoke('SendMessage', args: ['Hello, SignalR!']);
}
void disconnectFromSignalR() async {
await hubConnection.stop();
}
[@override](/user/override)
Widget build(BuildContext context) {
return Scaffold(
appBar: AppBar(
title: Text('SignalR Example'),
),
body: Center(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
children: <Widget>[
ElevatedButton(
onPressed: disconnectFromSignalR,
child: Text('Disconnect'),
),
],
),
),
);
}
[@override](/user/override)
void dispose() {
disconnectFromSignalR();
super.dispose();
}
}