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

标签 java spring websocket spring-websocket

我有一个 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);吗?当一个客户端发布消息时,所有其他客户端都能够接收到它,应该进行怎样的配置?

最佳答案

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

关于java - Spring Websocket 处理程序未向所有客户端发布消息,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61072137/

相关文章:

ios - React Native - iOS Real Device - Socket IO Web Sockets not working

node.js - 拦截(并可能拒绝)Web 套接字升级请求

java - 启动和停止 JMSContext

java - 具有前端和 Restful spring boot 应用程序

java - 如何排除/忽略 maven-emma 插件检测的类/包?

java - 部署到 Tomcat 的 Spring boot WAR 和缺少静态资源的上下文

java - 发起WebSocket连接的HTTP请求失败

java - @NonNullByDefault 项目范围设置

java - 是否可以使用 com.sun.net.httpserver.HttpServer 实现 HTTP 代理?

java - 无法使用 FTPSClient 通过 FTP 服务器传输数据 - 连接被拒绝