在这个伟大的答案中https://stackoverflow.com/a/27161986/4358405这里有一个如何在没有STOMP子协议的情况下(并且可能没有SockJS)使用原始Spring4 WebSockets的示例。
现在我的问题是:如何向所有客户广播?我希望看到一个API,我可以以类似的方式使用纯JSR356 websockets API:session.getBasicRemote().sendText(messJson);
是否需要保留所有WebSocketSession
对象,然后对每个对象调用sendMessage()
?
我找到了一个解决方案。在WebSocket处理程序中,我们管理WebSocketSession的列表,并在afterConnectionEstablished函数上添加新会话。
private List<WebSocketSession> sessions = new ArrayList<>();
synchronized void addSession(WebSocketSession sess) {
this.sessions.add(sess);
}
@Override
public void afterConnectionEstablished(WebSocketSession session) throws Exception {
addSession(session);
System.out.println("New Session: " + session.getId());
}
当我们需要广播时,只需枚举列表会话中的所有会话并发送消息。
for (WebSocketSession sess : sessions) {
TextMessage msg = new TextMessage("Hello from " + session.getId() + "!");
sess.sendMessage(msg);
}
希望得到帮助!
据我所知,并且可以从这里的文档中收集到,您不能使用WebSocketHandler
进行广播。
相反,您应该使用Stomp
,而不是使用由WebSocketMessageBrokerConfigurer
配置的WebSocket
,如下所述。
在代码中的任何位置使用SimpMessagingTemplate
向订阅的客户端发送消息,如这里所述