使用WebSocket的时候,由于要推送消息,可能有多个客户端同时在线,通常的处理方法都是把这些Channel放进一个Room里,而后一块儿通知。 上一篇已经简单的说明基于Nutz的Undertow插件集成WebSocket的方法,这里跟进一步,看看如何模拟Room。web
//添加WebSocket的Handler PathHandler pathHandler = Handlers.path().addPrefixPath("/myWebsocket", websocket(new WebSocketConnectionCallback() { @Override public void onConnect(WebSocketHttpExchange exchange, WebSocketChannel channel) { channel.getReceiveSetter().set(new AbstractReceiveListener() { @Override protected void onFullTextMessage(WebSocketChannel channel, BufferedTextMessage message) { //获取页面传递的message里的数据,这里封装了Nutz的一个Map工具,NutMap,里面包含了动做和房间名 //获取链接的channel //channel有一个setAttrbute方法,能够放一个UUID进去,以保证惟一。我本身是用“房间名@UUID”,用处后面会讲 //使用一个全局的Map,存进这个channel,并放进获取的房间名为Key的Map中 //这样就能在发送的时候,遍历某个房间里的全部channel,而后sendText了 } @Override protected void onClose(WebSocketChannel channel){ //在关闭的时候,记得找到房间,并移除这个channel //这个时候就须要这个channel里的attribute里的id了,解析出房间名,就能够在这个房间名为Key的Map里移除channel了 //有时候,一些特殊的需求,须要按照Channel来通讯,就是说一个用户一个Channel。这里没法直接获取Session,咱们能够使用一种变通的方法: //用户登陆成功以后,在Session里保存一个UUID,而后页面初始化的时候,用这个UUID做为房间名,就是惟一的了。 //到时候,只要能找到Session里的这个UUID,就能够单独给这个房间发送消息了 } }); channel.resumeReceives(); } })).addPrefixPath(contextPath, servletHandler);
暂时用文字说明一下,有空了补充代码。websocket