使用原始的Spring 4 WebSockets而不使用STOMP如何广播消息?

9
在这个很好的答案https://dev59.com/QV4d5IYBdhLWcg3wHPc9#27161986中,有一个使用原始Spring4 WebSockets的示例,没有STOMP子协议(也没有潜在的SockJS)。
现在我的问题是:如何向所有客户端广播?我希望看到一个类似于纯JSR 356 WebSocket API的API,以便可以像下面这样使用:session.getBasicRemote().sendText(messJson); 我需要自己维护所有的WebSocketSession对象,然后在每个对象上调用sendMessage()吗?

你好,我有和你一样的问题:如何向所有客户端广播?你有找到答案吗?感谢你的帮助。 - Delli Kilari
2个回答

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());
}

当我们需要进行广播时,只需遍历列表 sessions 中的所有会话并发送消息即可。

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

希望这可以帮到你!

我知道那个解决方案 - 这看起来就像是我在问题中已经提到的解决方案的实现。我更想知道它是否有任何缺点,是否有更好的方法或者这实际上是最好的解决方案。 - TMG
那么,@TMG,你想出了什么解决方案?我正在这里使用相同的解决方案,它对你有效吗? - Sepehr GH
@SepehrGH 那时候我没有找到更好的解决方案。我没有遇到任何特别的问题,但请不要把它视为我的认可。我很快就停止了在那个项目上的工作,所以我无法真正告诉你它是否运行良好。 - TMG
@TMG 感谢提供的信息。我们在消息系统中采用了这种方法(自主开发的协议)...认为它会很好地工作。 - Sepehr GH

0
据我所知并从文档这里中了解到,你不能使用WebSocketHandler进行广播。
相反,你应该使用Stomp通过由WebSocketMessageBrokerConfigurer配置的WebSocket来实现,具体描述在这里
在代码中的任何地方使用SimpMessagingTemplate向订阅的客户端发送消息,具体描述在这里

2
你所说的"你不能这样做"具体是指什么?是因为广播API不存在,还是由于我不知道的其他影响而无法保持List<WebSocketSession> - TMG
我尝试了SimpMessagingTemplate,但无法发送消息,也没有错误,请帮忙。 - Afroz Shaikh

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接