Как правильно реализовать java-клиент spring-websocket

Я работаю над клиентом Spring WebSocket Stomp для своего сервера WebSocket и получаю противоречивую информацию. Я нашел 2 способа заставить его работать, и, не вдаваясь в подробности, мне было интересно, какой способ считается «правильным» способом реализации клиента.

Может ли кто-нибудь помочь мне понять, для чего нужен WebSocketConnectionManager?

Кроме того, еще один вопрос: как мне сохранить открытое соединение с веб-сокетом и запустить программу для приема новых сообщений без необходимости писать строку System.in.read().

1-й способ: напрямую использовать SockJsClient

URI uri = new URI("ws://localhost:8080/stomp");
StandardWebSocketClient simpleWebSocketClient = new StandardWebSocketClient();

List<Transport> transports = new ArrayList<>(1);
transports.add(new WebSocketTransport(simpleWebSocketClient));

SockJsClient sockJsClient = new SockJsClient(transports);
sockJsClient.setMessageCodec(new Jackson2SockJsMessageCodec());

StompMessageReceiver messageHandler = new StompMessageReceiver();
StompWebSocketHandler websocketHandler = new StompWebSocketHandler(messageHandler, new StringMessageConverter());

try {
    this.webSocketClient.doHandshake(websocketHandler, null, uri).get();
} catch (InterruptedException | ExecutionException e) {
    throw new IllegalStateException(e);
}

System.in.read();

2-й способ: использование WebSocketConnectionManager

StandardWebSocketClient simpleWebSocketClient = new StandardWebSocketClient();
List<Transport> transports = new ArrayList<>(1);
transports.add(new WebSocketTransport(simpleWebSocketClient));

SockJsClient sockJsClient = new SockJsClient(transports);
sockJsClient.setMessageCodec(new Jackson2SockJsMessageCodec());

StompMessageHandler messageHandler = new StompMessageHandler();
StompWebSocketHandler websocketHandler = new StompWebSocketHandler(messageHandler, new StringMessageConverter());

WebSocketConnectionManager manager = new WebSocketConnectionManager(sockJsClient, websocketHandler, "ws://localhost:8080/stomp");

manager.start();

System.in.read();

Я знаю, что мог бы сделать это намного проще, используя аннотации для @Configuration и @Bean, но я пытаюсь сделать «сырую» реализацию, чтобы понять, как все работает вместе.

Еще немного информации:

<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-websocket</artifactId>
    <version>4.1.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>org.springframework</groupId>
    <artifactId>spring-messaging</artifactId>
    <version>4.1.4.RELEASE</version>
</dependency>
<dependency>
    <groupId>javax.websocket</groupId>
    <artifactId>javax.websocket-client-api</artifactId>
    <version>1.1</version>
</dependency>
<dependency>
    <groupId>org.apache.tomcat</groupId>
    <artifactId>tomcat-websocket</artifactId>
    <version>8.0.0-RC10</version>
</dependency>
<dependency>
    <groupId>com.fasterxml.jackson.core</groupId>
    <artifactId>jackson-databind</artifactId>
    <version>2.5.0</version>
</dependency>

person Kevin - NOAA Affiliate    schedule 03.02.2015    source источник


Ответы (1)


Если интересно, Spring Integration предоставляет реализацию для WebSocketClient.

И да, внутри он использует ConnectionManagerSupport.

Вот тестовый пример, который демонстрирует, как настроить его из @Configuration.

Но я думаю, вам следует попробовать готовую реализацию WebSocketHandler - SubProtocolWebSocketHandler и StompSubProtocolHandler.

person Artem Bilan    schedule 03.02.2015