如何在没有STOMP的情况下使用原始Spring 4 WebSockets广播消息



在这个伟大的答案中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向订阅的客户端发送消息,如这里所述

最新更新