【转】
https://www.cnblogs.com/chrischeng/p/10237523.html
最近在做一个WebSocket项目,后台使用了Stomp协议的WebSocketConfigurer,但是前端在测试的时候,发现一个很奇怪的问题:
本地的测试代码,最初我使用了Java+SockJS实现:
@Configuration @EnableWebSocketMessageBroker public class WebSocketStompConfig implements WebSocketMessageBrokerConfigurer { @Override public void registerStompEndpoints(StompEndpointRegistry registry) { registry.addEndpoint("/density") .setAllowedOrigins("*") //解决跨域问题 .withSockJS(); } @Override public void configureMessageBroker(MessageBrokerRegistry config) { config.enableSimpleBroker("/topic"); } }
1
2
3
|
var url = "http://172.18.171.167:8080/density" var socket = new SockJS(url) var stompClient = Stomp.over(socket) |
这种情况下自测可以通过
但是前端反应,SockJS不支持同时打开多个Socket订阅(我也不清楚到底是否真实,懒得追究了),于是需要研究如何在前端通过原生WebSocket的方式而不是SockJS的方式建立客户端(BTW 我一直觉得这是前端的活儿,我也不明白我一个后端为什么要搞这个)
按照网上的教程,写了如下的代码:
var stompClient = Stomp.client('ws://172.18.171.167:8080/density'); stompClient.connect({}, function (frame) { setConnected(true); console.log('Connected:' + frame); stompClient.subscribe('/topic/callback', function (response) { showCallback(response.body); }); });
但是这时无论如何,前端都会报如下的错误:
failed: Unexpected response code: 200
试了很多种方法,但是都没法儿解决问题,最终在Stack Overflow的一个回答下面的Comment里面找到答案:
将原来的URL
ws://172.18.171.167:8080/density/
改为
ws://172.18.171.167:8080/density/websocket
生效!!!
具体为什么,我也不知道。。。Orz