WebSocket 聊天室

通信流程

消息结构由一个简单的Json格式组成

{
    "event": "message",
    "data":""
}

event类型:messagename_ackbroadcasterror

交互图

基于 aqueduct 创建工程

执行命令,生成项目chat

pub global run aqueduct create chat

注册路由

  @override
  Controller get entryPoint {
    final router = Router();
    router
      .route("/connect")
      .link(() => new WebsocketController(chatRoom));
    return router;
  }

定义处理器

class WebsocketController extends Controller {
  WebsocketController(this.room);

  final ChatRoom room;

  @override
  Future<RequestOrResponse> handle(Request request) async {
    //将一个Http请求转为WebSocket连接
    final websocket = await WebSocketTransformer.upgrade(request.raw);
    room.add(websocket);

    return null;
  }
}

使用final websocket = await WebSocketTransformer.upgrade(request.raw);将Http请求转为WebSocket连接

处理多 Isolate

默认情况下,Aqueduct应用程序可在多个Isolate 上运行。由于每个Isolate 都有自己的堆,因此在另一个Isolate 上不能直接访问在这一个Isolate 上创建的 websocket !

因此需要使用ApplicationMessageHub来打通多个Isolate上的消息,实现消息群发。实际上就是一个广播流,每个Isolate都注册这个广播流即可

  @override
  Future prepare() async {
    chatRoom = new ChatRoom(messageHub);
    // 在当前Isolate 注册广播流监听
    messageHub.listen((event) {
      Map<String, dynamic> message = event;

      switch (message["event"]) {
        case "broadcast": chatRoom?.sendBytesToAllConnections(message["data"]);
      }
    });
  }

相关的官方文档

后续课程,将对该服务稍作修改,可直接作为Flutter聊天室的后台 demo。

注意,本课程的两个服务端,会支持下阶段Flutter全栈式课程的教学。


公众号“编程之路从0到1”

20190301102949549

Copyright © Arcticfox 2020 all right reserved,powered by Gitbook文档修订于: 2024-06-09 20:37:21

results matching ""

    No results matching ""