使用 Spring 的 SockJsClient 编写 java websocket 客户端

Write a java websocket client using Spring's SockJsClient

我有一个用 Java 编写的 WebSocket 服务器,启动时没有任何问题。 (在 "ws" 端点上)

很简单, 我想在以下任务中开发一个客户端:

  1. 创建到服务器的连接
  2. 订阅定义的主题(例如"topic/public")
  3. 从响应主题接收
  4. 发送至请求主题

当我如下使用 Stomp 时,效果很好。但是当我使用 StandardWebSocketClient 时我不能这样做。

    //Init
    WebSocketClient client = new StandardWebSocketClient();
    WebSocketStompClient stompClient = new WebSocketStompClient(client);
    stompClient.setMessageConverter(new MappingJackson2MessageConverter());
    StompSessionHandler sessionHandler = new CustomStompSessionHandler();

    //Connect
    StompSession stompSession = stompClient.connect("ws://localhost:8080/ws", sessionHandler).get();

    //Subscribe
    stompSession.subscribe("/topic/public", sessionHandler);

    //Send Message
    stompSession.send("/app/chat.addUser", new ChatMessage(MessageType.JOIN, "New User Added"));
    stompSession.send("/app/chat.sendMessage", new ChatMessage(MessageType.CHAT, "Test Message", "Test username"));

现在我想用 SockJsClient 来做这件事。握手和建立连接非常容易,但在那之后,我如何订阅特定主题?

    //Init
    List<Transport> transports = new ArrayList<>(2);
    transports.add(new WebSocketTransport(new StandardWebSocketClient()));
    transports.add(new RestTemplateXhrTransport());
    SockJsClient sockJsClient = new SockJsClient(transports);

    //Connect (Handshake)
    WebSocketSession webSocketSession = sockJsClient.doHandshake(new CustomWebSocketHandler(), "ws://localhost:8080/ws").get();

    //HOW CAN I SUBSCRIBE ?????

    //Send Message (To where? Which Path? Which topic)
    WebSocketMessage webSocketMessage = new TextMessage(new String("test Message").getBytes());
    webSocketSession.sendMessage(webSocketMessage);

In BRIEF: HOW CAN I SUBSCRIBE TO SPECIFIC TOPIC WHEN I USE SockJsClient?

提醒:服务器正常,另一种方法(StandardWebSocketClient)运行良好。

如果您想从头开始实施 STOMP 协议,那么您需要 read specification 并在短信正文中手动构建 SUBSCRIBE 和其他命令。

但是您可以使用配置的 SockJsClient 初始化相同的 WebSocketStompClient 作为 WebSocketClient 构造函数参数,例如 this