我有一个用 Java 编写的 WebSocket 服务器,启动时没有任何问题。 (在“ws”端点上)
简单地说, 我想开发一个执行以下任务的客户:
- 创建与服务器的连接
- 订阅定义的主题(例如“主题/公共(public)”)
- 从响应主题接收
- 发送到请求主题
当我如下使用 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/