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库。

示例

聊天客户端/服务器

集成测试应用

开始使用

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

1 回复

更多关于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();
  }
}
回到顶部