Spring Websocket 处理程序未向所有客户端发布消息

Posted

技术标签:

【中文标题】Spring Websocket 处理程序未向所有客户端发布消息【英文标题】:Spring Websocket Handler not publishing message to all clients 【发布时间】:2020-04-07 03:01:34 【问题描述】:

我有一个 Spring Websocket 服务器,很简单的一个:

@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer 
    @Override
    public void registerWebSocketHandlers(WebSocketHandlerRegistry webSocketHandlerRegistry) 
        webSocketHandlerRegistry.addHandler(new WebsocketHandler(), "/socket").setAllowedOrigins("*");
    
    @Bean
    public ServletServerContainerFactoryBean createWebSocketContainer() 
        ServletServerContainerFactoryBean container = new ServletServerContainerFactoryBean();
        container.setMaxBinaryMessageBufferSize(1024000);
        container.setMaxTextMessageBufferSize(1024000);
        return container;
    


还有

public class WebsocketHandler extends AbstractWebSocketHandler 
    @Override
    protected void handleTextMessage(WebSocketSession session, TextMessage message) throws IOException 
        System.out.println(message.getPayload()+"\n");
        session.sendMessage(message);
    

    @Override
    protected void handleBinaryMessage(WebSocketSession session, BinaryMessage message) throws IOException 
        System.out.println("New Binary Message Received");
        session.sendMessage(message);
    

当我打开一个带有 SockJS 库的简单 html 客户端时,客户端可以从服务器发送接收消息,但是如果我用类似客户端打开一个新选项卡,它就无法接收另一个发布的消息客户。

这是因为session.sendMessage(message);吗?当一个客户端发布消息时所有其他客户端都能够接收它应该是什么配置?

【问题讨论】:

【参考方案1】:

如果要将数据发送给其他客户端,则需要跟踪会话。正如您在LINK 的文档中看到的那样,处理程序还具有两个功能,用于连接打开后和连接关闭后。那么这对你有什么帮助呢? 您可以保持一个同步集合,如CopyOnWriteList<T> 或使用Collections.Synchronized,当客户端连接时(afterConnectionEstablished(WebSocketSession session)),将此客户端添加到此集合或客户端断开连接时(afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus)),您可以从您的收藏。当您想向每个客户端发送消息时,请遍历此集合并使用会话发送对象。如果您仍然觉得这令人困惑,我可以提供一个代码示例。

【讨论】:

以上是关于Spring Websocket 处理程序未向所有客户端发布消息的主要内容,如果未能解决你的问题,请参考以下文章

Spring 4 - websocket 消息传递 stomp 处理程序

Spring 微服务实例未向在 8761 以外的端口中运行的 Eureka 注册

在 Amazon Beanstalk 上处理 Spring Boot 集群 Websocket

Amazon Cognito 未向我的应用程序用户发送 SMS 文本消息

是否可以与 Spring MVC 一起创建 WebSocket 应用程序

java - 如何使用simplebroker或rabbitMQ和java spring在websocket中获取所有连接的用户