2015-02-03 6 views
8

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> 

Odpowiedz

3

Jeśli jest interesująca Integracja Wiosna zapewnia implementację dla WebSocketClient.

I tak, wewnętrznie używa ConnectionManagerSupport.

Oto test-case, który pokazuje, jak skonfigurować go z @Configuration.

Ale sądzę, że powinieneś wypróbować bezobsługową implementację WebSocketHandler - SubProtocolWebSocketHandler i StompSubProtocolHandler.

Powiązane problemy