Nutz-plugins-undertow配合WebSocket,模拟Room的方法
Nutz-plugins-undertow配合WebSocket,模拟Room的方法
黄道坤 发表于8个月前
Nutz-plugins-undertow配合WebSocket,模拟Room的方法
  • 发表于 8个月前
  • 阅读 11
  • 收藏 0
  • 点赞 0
  • 评论 0

【腾讯云】新注册用户域名抢购1元起>>>   

使用WebSocket的时候,因为要推送消息,可能有多个客户端同时在线,一般的处理方法都是把这些Channel放进一个Room里,然后一起通知。 上一篇已经简单的说明基于Nutz的Undertow插件集成WebSocket的方法,这里跟进一步,看看如何模拟Room。

//添加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);           

暂时用文字说明一下,有空了补充代码。

标签: Nutz Undertow WS
  • 打赏
  • 点赞
  • 收藏
  • 分享
共有 人打赏支持
粉丝 1
博文 5
码字总数 13828
×
黄道坤
如果觉得我的文章对您有用,请随意打赏。您的支持将鼓励我继续创作!
* 金额(元)
¥1 ¥5 ¥10 ¥20 其他金额
打赏人
留言
* 支付类型
微信扫码支付
打赏金额:
已支付成功
打赏金额: