使用 Spring 的 SockJsClient 编写 java websocket 客户端
Write a java websocket client using Spring's SockJsClient
我有一个用 Java 编写的 WebSocket 服务器,启动时没有任何问题。 (在 "ws" 端点上)
很简单,
我想在以下任务中开发一个客户端:
- 创建到服务器的连接
- 订阅定义的主题(例如"topic/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 协议,那么您需要 read specification 并在短信正文中手动构建 SUBSCRIBE
和其他命令。
但是您可以使用配置的 SockJsClient
初始化相同的 WebSocketStompClient
作为 WebSocketClient
构造函数参数,例如 this
我有一个用 Java 编写的 WebSocket 服务器,启动时没有任何问题。 (在 "ws" 端点上)
很简单, 我想在以下任务中开发一个客户端:
- 创建到服务器的连接
- 订阅定义的主题(例如"topic/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 协议,那么您需要 read specification 并在短信正文中手动构建 SUBSCRIBE
和其他命令。
但是您可以使用配置的 SockJsClient
初始化相同的 WebSocketStompClient
作为 WebSocketClient
构造函数参数,例如 this