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

TMG*_*TMG 7 spring websocket spring-4

在这个伟大的答案/sf/answers/1901339051/有一个例子,说明如何使用没有STOMP子协议的原始Spring4 WebSockets(并且可能没有SockJS).

现在我的问题是:我如何向所有客户广播?我期望看到一个API,我可以使用类似于纯JSR 356 websockets API的API:session.getBasicRemote().sendText(messJson);

我是否需要自己保留所有WebSocketSession对象,然后调用sendMessage()每个对象?

小智 6

我找到了解决方案。在 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());
}
Run Code Online (Sandbox Code Playgroud)

当我们需要广播时,只需枚举列表会话中的所有会话并发送消息。

for (WebSocketSession sess : sessions) {
        TextMessage msg = new TextMessage("Hello from " + session.getId() + "!");
        sess.sendMessage(msg);
}
Run Code Online (Sandbox Code Playgroud)

希望这有帮助!


s.i*_*pma 0

据我所知并可以从此处的文档中收集到,您无法使用WebSocketHandler.

相反,您应该使用a 的Stomp过度配置,如此处所述WebSocketWebSocketMessageBrokerConfigurer

使用SimpMessagingTemplate代码中的任意位置将消息发送到订阅的客户端,如此处所述

  • “你不能这样做”到底是什么意思?我无法使用广播 API,因为它不存在,或者我无法保留“List&lt;WebSocketSession&gt;”,因为我不知道其他一些含义? (2认同)