春季框架 WebSocket 无法建立连接。

huangapple go评论91阅读模式
英文:

spring websocket cannot establish connection

问题

无法通过浏览器客户端与我的WebSocket服务器建立连接。

配置:

  1. @Configuration
  2. @EnableWebSocketMessageBroker
  3. public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
  4. @Override
  5. public void configureMessageBroker(MessageBrokerRegistry config) {
  6. config.enableSimpleBroker("/topic/", "/queue/");
  7. config.setApplicationDestinationPrefixes("/app");
  8. }
  9. @Override
  10. public void registerStompEndpoints(StompEndpointRegistry registry) {
  11. registry.addEndpoint("/greeting");
  12. }
  13. }

控制器:

  1. @MessageMapping("/message")
  2. @SendToUser("/queue/reply")
  3. public String processMessageFromClient(@Payload String message, Principal principal) throws Exception {
  4. String name = new Gson().fromJson(message, Map.class).get("name").toString();
  5. System.out.println(name);
  6. // messagingTemplate.convertAndSendToUser(principal.getName(), "/queue/reply", name);
  7. return name;
  8. }

我启动了服务器,然后在浏览器中打开index.html,然后连接到ws://localhost:8080/greeting,然后发送消息到/app/message,但实际上什么都没有发生。浏览器检查器显示404错误。我做错了什么?

英文:

cannot establish connection to my websocket server by browser client.

configuration:

  1. @Configuration
  2. @EnableWebSocketMessageBroker
  3. public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
  4. @Override
  5. public void configureMessageBroker(MessageBrokerRegistry config) {
  6. config.enableSimpleBroker("/topic/", "/queue/");
  7. config.setApplicationDestinationPrefixes("/app");
  8. }
  9. @Override
  10. public void registerStompEndpoints(StompEndpointRegistry registry) {
  11. registry.addEndpoint("/greeting");
  12. }
  13. }

And controller:

  1. @MessageMapping("/message")
  2. @SendToUser("/queue/reply")
  3. public String processMessageFromClient(@Payload String message, Principal principal) throws Exception {
  4. String name = new Gson().fromJson(message, Map.class).get("name").toString();
  5. System.out.println(name);
  6. //messagingTemplate.convertAndSendToUser(principal.getName(), "/queue/reply", name);
  7. return name;
  8. }

I start server, and then open index.html in browser then make connect to ws://localhost:8080/greeting
and after that sending message to /app/message

but actually happens nothing. Browser inspector shows 404. What's wronng i do?

答案1

得分: 1

以下是使用Spring实现WebSocket的方式。首先,您应该配置WebSocket消息代理并注册stomp端点,如下所示。这里我使用setAllowedOrigins("*").withSockJS()来允许任何主机访问此端点。

  1. @Configuration
  2. @EnableWebSocketMessageBroker
  3. public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
  4. @Override
  5. public void registerStompEndpoints(StompEndpointRegistry registry) {
  6. registry.addEndpoint("/greeting")
  7. .setAllowedOrigins("*")
  8. .withSockJS();
  9. }
  10. @Override
  11. public void configureMessageBroker(MessageBrokerRegistry registry) {
  12. registry.setApplicationDestinationPrefixes("/app")
  13. .enableSimpleBroker("/topic", "/queue/");
  14. }
  15. }

然后我创建以下控制器。

  1. @Controller
  2. public class WebSocketController {
  3. private final SimpMessagingTemplate template;
  4. @Autowired
  5. WebSocketController(SimpMessagingTemplate template){
  6. this.template = template;
  7. }
  8. @MessageMapping("/queue/reply")
  9. public void sendMessage(String message){
  10. System.out.println(message);
  11. this.template.convertAndSend("/topic", message);
  12. }
  13. }

使用@MessageMapping("/queue/reply")替代上面的@SendToUser("/queue/reply")。

通过这个Simple Messaging Template,我使用convertAndSend()方法与消息代理进行异步数据通信。如果有任何数据传输到消息代理,它将自动使用上面配置的带有SockJS和Stomp的端点/socket来发送该数据。

您可以参考此文章以了解更多关于Spring WebSocket的信息。

英文:

Here is the way that use to implement WebSocket in Spring. First, you should configure the Web socket message broker and register the stomp endpoint as below. Here I use setAllowedOrigins("*").withSockJS() to access this endpoint to any host.

  1. @Configuration
  2. @EnableWebSocketMessageBroker
  3. public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
  4. @Override
  5. public void registerStompEndpoints(StompEndpointRegistry registry) {
  6. registry.addEndpoint("/greeting")
  7. .setAllowedOrigins("*")
  8. .withSockJS();
  9. }
  10. @Override
  11. public void configureMessageBroker(MessageBrokerRegistry registry) {
  12. registry.setApplicationDestinationPrefixes("/app")
  13. .enableSimpleBroker("/topic", "/queue/");
  14. }
  15. }

Then I create the controller as below.

  1. @Controller
  2. public class WebSocketController {
  3. private final SimpMessagingTemplate template;
  4. @Autowired
  5. WebSocketController(SimpMessagingTemplate template){
  6. this.template = template;
  7. }
  8. @MessageMapping("/queue/reply")
  9. public void sendMessage(String message){
  10. System.out.println(message);
  11. this.template.convertAndSend("/topic", message);
  12. }
  13. }

Use @MessageMapping("/queue/reply") instead of @SendToUser("/queue/reply") as above.

> From that Simple Messaging Template, I used convertAndSend() method to
> asynchronous data communication with that message broker. If there is
> any data comes to that message broker it will automatically send that
> data using the above configured endpoint called /socket with SockJS
> and Stomp.

You can refer this article to learn more about the Spring web socket.

huangapple
  • 本文由 发表于 2020年9月23日 13:51:15
  • 转载请务必保留本文链接:https://go.coder-hub.com/64021798.html
匿名

发表评论

匿名网友

:?: :razz: :sad: :evil: :!: :smile: :oops: :grin: :eek: :shock: :???: :cool: :lol: :mad: :twisted: :roll: :wink: :idea: :arrow: :neutral: :cry: :mrgreen:

确定