【问题标题】:spring websocket cannot establish connectionspring websocket 无法建立连接
【发布时间】:2020-09-23 05:51:15
【问题描述】:

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

配置:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

@Override
public void configureMessageBroker(MessageBrokerRegistry config) {
    config.enableSimpleBroker("/topic/", "/queue/");
    config.setApplicationDestinationPrefixes("/app");
}

@Override
public void registerStompEndpoints(StompEndpointRegistry registry) {
    registry.addEndpoint("/greeting");
}


}

和控制器:

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

我启动服务器,然后在浏览器中打开 index.html 然后连接到ws://localhost:8080/greeting 然后发送消息到/app/message

但实际上什么也没发生。浏览器检查器显示 404。我做错了什么?

【问题讨论】:

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

标签: java spring-websocket


【解决方案1】:

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

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {
    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/greeting")
                .setAllowedOrigins("*")
                .withSockJS();
    }
    @Override
    public void configureMessageBroker(MessageBrokerRegistry registry) {
        registry.setApplicationDestinationPrefixes("/app")
                .enableSimpleBroker("/topic", "/queue/");
    }
}

然后我创建如下控制器。

@Controller
public class WebSocketController {

    private final SimpMessagingTemplate template;

    @Autowired
    WebSocketController(SimpMessagingTemplate template){
        this.template = template;
    }

    @MessageMapping("/queue/reply")
    public void sendMessage(String message){
        System.out.println(message);
        this.template.convertAndSend("/topic",  message);
    }
}
  

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

从那个简单消息模板中,我使用了 convertAndSend() 方法 与该消息代理的异步数据通信。如果有 任何数据到达该消息代理它会自动发送 使用上面配置的名为 /socket 的端点和 SockJS 的数据 和跺脚。

您可以参考this文章了解更多关于Spring web socket的信息。

【讨论】:

  • 那行不通。还通过websocketking.com 进行了测试,难道操作系统会以某种方式阻止 ws 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-11-05
  • 2019-09-15
  • 2012-10-17
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多