我正在使用ngWebsocket来监听用户操作,并根据当前操作更新所有用户页面,而不仅仅是发送操作的页面。
我在java中做了一个端点,它捕获所有操作并发送所有打开的会话的消息。 但是当我测试时,端点找到会话并向所有人发送消息,但消息只是发送给发送操作的人。
我的 Java 代码喜欢
@OnMessage
public String onMessage(Session session, String message) { Gson gson = new Gson();
SocketMessage sm = gson.fromJson(message, new SocketMessage().getClass());
if (sm.getEvent().equals("teklif")) {
Set<Session> openSessions = session.getOpenSessions();
for (Session openSession : openSessions) {
try {
openSession.getBasicRemote().sendText("{"event":"teklif","data":" + sm.getData() + "}");
} catch (Exception ioe) {
System.out.println(ioe.getMessage());
}
}
}
return message;
}`
当我调试Set<Session> openSessions = session.getOpenSessions();
时,它向我显示两个会话并向所有远程发送消息。我在控制器中聆听
$rootScope.ws.$on('teklif', function (data) { console.log(data);
});
它仅显示发出消息的人
注意:我发送这样的消息 --> $rootScope.ws.$emit('teklif', data.content);
如何使所有用户都侦听所有操作的套接字?
提前谢谢。
您正在使用Session.getOpenSessions()
.Javadoc指出:
返回所有打开的 Web 套接字会话集的副本,该会话 表示与此会话到的同一终结点的连接 表示连接。集合包括此方法的会话 叫了起来。这些会话在 返回此方法。例如,稍后遍历集合 时间可能会产生一个或多个非公开会话。开发人员应使用 session.isOpen() 进行检查。
因此,它不会为您提供连接到终结点的所有客户端会话的集合。
相反,您需要自己跟踪连接到终端节点的所有会话,并迭代该集。下面是一个示例。
我发现我的问题是什么.
@OnMessage
public String onMessage(Session session, String message) {
Gson gson = new Gson();
SocketMessage sm = gson.fromJson(message, new SocketMessage().getClass());
if (sm.getEvent().equals("teklif")) {
//SoncketTestMessage fromJson = gson.fromJson(test.getData(), SoncketTestMessage.class);
Set<Session> openSessions = session.getOpenSessions();
for (Session openSession : openSessions) {
try {
SocketResponse rsp = new SocketResponse();
rsp.setEvent("teklif");
rsp.setData(gson.toJson(sm.getData()));
//openSession.getBasicRemote().sendText("{"event":"teklif","data":" + sm.getData() + "}");
openSession.getBasicRemote().sendText(gson.toJson(rsp, SocketResponse.class));
} catch (Exception ioe) {
System.out.println(ioe.getMessage());
}
}
}
return null;
}
我犯了一个错误
openSession.getBasicRemote().sendText("{"event":"teklif","data":" + sm.getData() + "}");
我刚刚更改了sm.getData并发送正确的json格式,然后将其发送给所有用户。
由于该函数返回消息,它之前只发送给所有者,并且格式正确,只有所有者才能获得返回。现在所有用户都收到消息。