Spring Websocket Handler не публикует сообщения всем клиентам - PullRequest
0 голосов
/ 07 апреля 2020

У меня есть сервер 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);
    }
}

Когда я открываю клиент, который является простым HTML с Sock JS библиотека, клиент может отправлять полученные сообщения с сервера, но если я открою новую вкладку с подобным клиентом, он не сможет получать сообщения, отправленные другим клиентом.

Это из-за session.sendMessage(message);? Какова должна быть конфигурация, чтобы, когда один клиент отправлял сообщения, все другие клиенты могли получать его?

1 Ответ

1 голос
/ 11 апреля 2020

Если вы хотите отправить данные другим клиентам, вам необходимо отслеживать сеансы. Как вы можете видеть в документе на этом LINK , обработчик также имеет две функции для после открытия соединения и после закрытия соединения. Так как это поможет вам? Вы можете сохранить синхронизированную коллекцию, например CopyOnWriteList<T>, или использовать Collections.Synchronized, когда клиент подключается (afterConnectionEstablished(WebSocketSession session)), добавляет этот клиент в эту коллекцию или, когда клиент отключается (afterConnectionClosed(WebSocketSession session, CloseStatus closeStatus)), вы можете удалить сеанс из коллекция. когда вы хотите отправить сообщение каждому клиенту, l oop поверх этой коллекции и используйте сеанс для отправки объектов. если вы все еще находите это непонятным, я могу предоставить пример кода.

...