如何正确实现 spring-websocket java 客户端
How to correctly implement a spring-websocket java client
我正在为我的 WebSocket 服务器开发 Spring WebSocket Stomp 客户端,但我收到了相互矛盾的信息。
我已经找到了 2 种方法来让它工作,并且没有过多的细节我想知道哪种方式被认为是实现客户端的 "correct" 方式。
有人可以帮助我了解 WebSocketConnectionManager 的用途吗?
另外,还有一个问题,我如何保持 websocket 连接打开以及程序 运行 接受新消息而无需编写行 System.in.read().
第一种方式:直接使用 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();
第二种方式:使用 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
的注释使这变得更简单,但我正在尝试做一个 "raw" 实现,所以我可以理解一切一起工作。
更多信息:
<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>
如果有趣 Spring 集成提供了 WebSocketClient 的实现。
是的,它在内部使用 ConnectionManagerSupport
。
这里有一个 test-case,演示了如何从 @Configuration
配置它。
但我认为您应该尝试开箱即用的 WebSocketHandler
实现 - SubProtocolWebSocketHandler
和 StompSubProtocolHandler
.
我正在为我的 WebSocket 服务器开发 Spring WebSocket Stomp 客户端,但我收到了相互矛盾的信息。 我已经找到了 2 种方法来让它工作,并且没有过多的细节我想知道哪种方式被认为是实现客户端的 "correct" 方式。
有人可以帮助我了解 WebSocketConnectionManager 的用途吗?
另外,还有一个问题,我如何保持 websocket 连接打开以及程序 运行 接受新消息而无需编写行 System.in.read().
第一种方式:直接使用 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();
第二种方式:使用 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
的注释使这变得更简单,但我正在尝试做一个 "raw" 实现,所以我可以理解一切一起工作。
更多信息:
<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>
如果有趣 Spring 集成提供了 WebSocketClient 的实现。
是的,它在内部使用 ConnectionManagerSupport
。
这里有一个 test-case,演示了如何从 @Configuration
配置它。
但我认为您应该尝试开箱即用的 WebSocketHandler
实现 - SubProtocolWebSocketHandler
和 StompSubProtocolHandler
.