如何正确实现spring-websocket java客户端
我正在为我的WebSocket服务器开发一个Spring WebSocket Stomp Client,我收到了相互矛盾的信息。 我找到了两种方法让它工作,而没有太多细节我想知道哪种方式被认为是实现客户端的“正确”方式。
有人可以帮我理解WebSocketConnectionManager的用途吗?
另外,还有一个问题,我如何保持websocket连接打开,程序运行以接受新消息,而不必编写System.in.read()行。
第一种方式:直接使用SockJsClient
URI uri = new URI("ws://localhost:8080/stomp"); StandardWebSocketClient simpleWebSocketClient = new StandardWebSocketClient(); List 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 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
的Annotations可以使这更简单,但我正在尝试做一个“原始”实现,这样我就能理解一切是如何协同工作的。
更多信息:
org.springframework spring-websocket 4.1.4.RELEASE org.springframework spring-messaging 4.1.4.RELEASE javax.websocket javax.websocket-client-api 1.1 org.apache.tomcat tomcat-websocket 8.0.0-RC10 com.fasterxml.jackson.core jackson-databind 2.5.0
如果有趣的话,Spring Integration为WebSocketClient提供了一个实现。
是的,在内部它使用ConnectionManagerSupport
。
这是一个测试用例 ,演示了如何从@Configuration
配置它。
但我认为您应该尝试使用开箱即用的WebSocketHandler
实现 – SubProtocolWebSocketHandler
和StompSubProtocolHandler
。