Pracuję nad klientem Spring WebSocket Stomp dla mojego serwera WebSocket Server i otrzymuję sprzeczne informacje. Znalazłem 2 sposoby na sprawienie, żeby działało i bez wchodzenia w szczegóły, zastanawiałem się, która metoda jest uważana za "prawidłowy" sposób implementacji klienta.W jaki sposób poprawnie zaimplementować klienta java spring-websocket
Czy ktoś mógłby mi pomóc zrozumieć, do czego służy WebSocketConnectionManager?
Jeszcze jedno pytanie, w jaki sposób mogę utrzymać otwarte połączenie websocket i program do akceptowania nowych wiadomości bez konieczności pisania linii System.in.read().
1'st sposób: Korzystanie z SockJsClient bezpośrednio
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'nd sposób: Korzystanie z 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();
wiem, że mogę zrobić to dużo prostsze przy użyciu adnotacji na @Configuration
i @Bean
, ale próbuję wykonać "surową" implementację, aby zrozumieć, jak wszystko działa razem.
Trochę więcej informacji:
<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>