【问题标题】:How to broadcast a message using raw Spring 4 WebSockets without STOMP?如何在没有 STOMP 的情况下使用原始 Spring 4 WebSockets 广播消息?
【发布时间】:2016-02-27 21:31:07
【问题描述】:

在这个很好的答案https://stackoverflow.com/a/27161986/4358405 中有一个示例,说明如何在没有 STOMP 子协议(并且可能没有 SockJS)的情况下使用原始 Spring4 WebSockets。

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

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

【问题讨论】:

  • 您好,您有同样的问题:如何向所有客户广播?你有/得到这个答案吗?谢谢你的帮助。

标签: spring websocket spring-4


【解决方案1】:

我找到了解决方案。在 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);
}

希望对您有所帮助!

【讨论】:

  • 我知道该解决方案 - 这看起来与我在问题中已经提到的解决方案的实现完全一样。我更想知道它是否有任何缺点,是否有更好的方法,或者这实际上是最好的解决方案。
  • 那么@TMG 你想出了什么解决方案?我在这里做同样的解决方案,它对你有用吗?
  • @SepehrGH 当时我没有找到更好的东西。我没有遇到此解决方案的任何特殊问题,但不要将其视为我的认可。我很快就停止了那个项目的工作,我真的不知道它是否有效。
  • @TMG 感谢您提供的信息。我在我们的消息传递系统(自开发协议)中使用了这种方法......认为它可以正常工作
【解决方案2】:

据我所知并且可以从文档here 收集到,您无法使用WebSocketHandler 进行广播。

相反,您应该使用Stomp 而不是由WebSocketMessageBrokerConfigurer 配置的WebSocket,如here 所述。

在代码中的任意位置使用SimpMessagingTemplate 向订阅的客户端发送消息,如here 所述

【讨论】:

  • “你不能这样做”到底是什么意思?我不能使用广播 API,因为它不存在,或者我不能保留 List&lt;WebSocketSession&gt; 因为我不知道的其他一些含义?
  • 我试过 SimpMessagingTemplate 但它无法发送,没有错误,请帮助
猜你喜欢
  • 1970-01-01
  • 2018-04-02
  • 2014-12-15
  • 2015-03-22
  • 2014-02-21
  • 2014-08-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多