【问题标题】:How to correctly implement a spring-websocket java client如何正确实现spring-websocket java客户端
【发布时间】:2015-02-03 16:52:28
【问题描述】:

我正在为我的 WebSocket 服务器开发 Spring WebSocket Stomp Client,但我收到了相互冲突的信息。 我找到了 2 种让它工作的方法,并且没有过多详细说明,我想知道哪种方式被认为是实现客户端的“正确”方式。

有人可以帮我理解 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 的注释来简化此操作,但我正在尝试进行“原始”实现,以便了解所有内容如何协同工作。

更多信息:

<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>

【问题讨论】:

    标签: java spring spring-websocket


    【解决方案1】:

    如果有趣的话,Spring Integration 提供了 WebSocketClient 的实现。

    是的,它在内部使用ConnectionManagerSupport

    这是一个test-case,它演示了如何从@Configuration 配置它。

    但我认为您应该尝试开箱即用的 WebSocketHandler 实现 - SubProtocolWebSocketHandlerStompSubProtocolHandler

    【讨论】:

      猜你喜欢
      • 2018-09-10
      • 2014-09-30
      • 2013-02-12
      • 1970-01-01
      • 1970-01-01
      • 2022-12-19
      • 2012-09-25
      • 2015-03-01
      • 1970-01-01
      相关资源
      最近更新 更多