android socket多路由,flutter 自定义websocket路由的实现

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

自己想的一个办法:

在 lib 目录下新建一个 socket 目录 里面创建两个文件main.dart和router.dart;

main.dart : 主要控制websocket的连接 断开 和收到消息的处理;

router.dart 则为websocket 服务端返回的消息做路由处理;

router.dart

import 'package:lee/logic/user.dart';

typedef void RouteHandle(Map params);

var wsRouter = new WsRouter();

class WsRouter {

static Map _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 handle(String name, Map params) async {

RouteHandle handle = WsRouter._routers[name];

if (handle == null) {

print("路由不存在");

return;

}

handle(params);

}

}

List> routers = [

{"login": UserLogic.login},

{"kick": UserLogic.kick},

];

main.dart

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 {}

}

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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值