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)