服务器之家:专注于VPS、云服务器配置技术及软件下载分享
分类导航

PHP教程|ASP.NET教程|Java教程|ASP教程|编程技术|正则表达式|C/C++|IOS|C#|Swift|Android|VB|R语言|JavaScript|易语言|vb.net|

服务器之家 - 编程语言 - Android - flutter 自定义websocket路由的实现

flutter 自定义websocket路由的实现

2022-11-11 15:31李昊天 Android

这篇文章主要介绍了flutter 自定义websocket路由的实现,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧

在 flutter websocket 中 服务端推送数据给客户端后 很多人的处理居然都是 if / switch; 感觉这样的写法不咋好!

自己想的一个办法:

在 lib 目录下新建一个 socket 目录 里面创建两个文件main.dart和router.dart;
main.dart : 主要控制websocket的连接 断开 和收到消息的处理;
router.dart 则为websocket 服务端返回的消息做路由处理;

router.dart

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
import 'package:lee/logic/user.dart';
 
typedef void RouteHandle(Map params);
 
var wsRouter = new WsRouter();
 
class WsRouter {
 static Map<String, RouteHandle> _routers = new Map();
 
 init() {
  routers.forEach((route) {
   route.forEach((name, value) {
    this.add(name, value);
   });
  });
 }
 
 // 增加路由
 void add(String name, RouteHandle handle) {
  WsRouter._routers[name] = handle;
 }
 
 // 路由处理
 Future<void> handle(String name, Map params) async {
  RouteHandle handle = WsRouter._routers[name];
  if (handle == null) {
   print("路由不存在");
   return;
  }
  handle(params);
 }
}
 
List<Map<String, RouteHandle>> routers = [
 {"login": UserLogic.login},
 {"kick": UserLogic.kick},
];

main.dart

?
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
import 'package:lee/socket/router.dart';
import 'package:web_socket_channel/io.dart';
import 'dart:convert';
 
var webSocket = new WebSocket();
 
class WebSocket {
 // webSocket连接
 IOWebSocketChannel webSocketChannel;
 
 factory WebSocket() => _webSocket();
 
 static WebSocket _instance;
 
 // 构造函数
 WebSocket._() {
  // 初始化webSocket路由
  wsRouter.init();
 }
 
 static WebSocket _webSocket() {
  if (_instance == null) {
   _instance = WebSocket._();
  }
  return _instance;
 }
 
 conn() {
  IOWebSocketChannel channel = new IOWebSocketChannel.connect(
    "ws://127.0.0.1:8080/ws",
    pingInterval: Duration(milliseconds: 100));
 
  channel.stream
    .listen((data) => onMessage(data), onError: onError, onDone: onDone);
 
  this.webSocketChannel = channel;
 }
 
 onMessage(response) async {
  // 例如服务端返回的大概是这样一个json
  // {"cmd":"kick","data":{}}
  // {"cmd":"login","data":{}}
  Map params = json.decode(response);
  wsRouter.handle(params["cmd"], params["data"]);
 }
 
 onError(err) async {}
 
 onDone() async {}
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持服务器之家。

原文链接:https://segmentfault.com/a/1190000021229915

延伸 · 阅读

精彩推荐