繁体   English   中英

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

[英]Spring Websocket Handler not publishing message to all clients

我有一个 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); ? 当一个客户端发布消息时所有其他客户端都能够接收它应该是什么配置?

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM