WebSocket 聊天室
通信流程
消息结构由一个简单的Json格式组成
{
"event": "message",
"data":""
}
event类型:message、name_ack、broadcast、error

基于 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”