我正在使用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);
});
只显示发出消息的人
注意:我发送的信息是这样的 - &gt; $rootScope.ws.$emit('teklif', data.content);
如何让所有用户都听取所有操作的套接字?
提前致谢。
答案 0 :(得分:0)
您正在使用Session.getOpenSessions()
。 Javadoc说:
返回所有打开的Web套接字会话集的副本 表示与此会话所在的同一端点的连接 代表一个连接。 Set包含此方法的会话 拜访。这些会议可能在此之后的任何时候都不会公开 返回此方法。例如,稍后迭代该集合 时间可能产生一个或多个封闭的会话。开发人员应该使用 session.isOpen()来检查。
所以不会为您提供连接到您的终端的所有客户端会话。
相反,您需要自己跟踪连接到端点的所有会话,并迭代该集合。这是一个example。
答案 1 :(得分:0)
我发现我的问题是什么。
@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格式,然后发送给所有用户。
由于该函数返回消息它之前只发送给所有者,并且它是正确的格式并且只有所有者才能获得返回。现在所有用户都收到了消息。