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

标签 java spring spring-boot websocket spring-websocket

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

简单地说, 我想开发一个执行以下任务的客户:

  1. 创建与服务器的连接
  2. 订阅定义的主题(例如“主题/公共(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 协议(protocol),那么你需要 read specification并在短信正文中手动构建 SUBSCRIBE 和其他命令。

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

关于java - 使用Spring的SockJsClient编写一个java websocket客户端,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59270908/

相关文章:

java - 包含 JSP 的 Spring Controller @RequestMapping

mysql - 陷入在 Hibernate 中编写 HQL/MySQL 查询的困境

java - Spring RestController 产生 charset=UTF-8

java - 无法解析符号org.springframework.test.web.server

java - 如何在java中的图像上添加可移动的TextArea?

java - Android studio 抽屉导航不处理点击

java - 我应该把提取所有类别并使其可见的代码放在哪里

java - 什么是 "SocketTimeoutException connect time out"以及如何修复它?

java - Spring security-在 rest 服务中将凭据作为 json 而不是常规形式发送

excel - 在 XSSFWorkbook 中保存时日期字段未以正确格式保存