NutzCN Logo
问答 websocket插件前端的房间号到后台会加 wsroom: 前缀
发布于 2431天前 作者 duTaojin 2105 次浏览 复制 上一个帖子 下一个帖子
标签: websocket

https://github.com/nutzam/nutzmore/tree/master/nutz-plugins-websocket
按照如上文档操作,前端执行 ws.send(JSON.stringify({room:'home',"action":"join"}));,进入到后台的 AbstractWsHandler 类的如下方法

public void join(String room) {
        if (!Strings.isBlank(room)) {
            rooms.add(room);
            room = prefix + room;
            log.debugf("session(id=%s) join room(name=%s)", session.getId(), room);
            roomProvider.join(room, session.getId());
        }
    }

此方法并没有什么问题,只是会加入 prefix 前缀,默认值为 wsroom:
但从服务器主动发消息给房间,文档代码如下:

public void sayhi(String room) {
    myWebsocket.each(room, new Each<Session>() {
    	public void invoke(int index, Session ele, int length) {
                myWebsocket.sendJson(ele.getId(), new NutMap("action", "layer").setv("notify", "你有新的待办事宜,请查看收件箱"));
            }
    });
}

会进入到 AbstractWsEndpoint 类的 each 方法,如下:

public void each(String room, final Each<Session> callback) {
        Set<String> wsids = roomProvider.wsids(room);
        if (wsids == null || wsids.isEmpty())
            return;
        String[] tmp = wsids.toArray(new String[wsids.size()]);
        Lang.each(tmp, new Each<String>() {
            public void invoke(int index, String ele, int length)
                    throws ExitLoop, ContinueLoop, LoopException {
                Session session = getSession(ele);
                if (session != null)
                    callback.invoke(index, session, length);
            }
        });
    }

此时默认没有添加前缀,会造成前端收不到消息。解决方法就是 从服务器主动发消息给房间 方法的房间号手动加前缀 wsroom:
本人为此困惑了一个下午,看大家都没有这个问题,不知是不是本人的环境或者其它问题造成的。(环境JDK8,Tomcat8,nutz-1.r.62)

3 回复

这个bug已经fix,而且你可以看到"扩展或实现WsHandler(简单版)"里面有一句:

    public MySimpleWsHandler() {
        super(""); // 覆盖默认前缀
    }

覆盖默认前缀就好了

添加回复
请先登陆
回到顶部