我至少已经为此挣扎了两个星期。我对websockets非常陌生,但是在rest端点方面有丰富的经验。
我的用例很简单。客户端启动一个websocket连接,向服务器发送一些信息,服务器使用这些信息,并以每5秒一次的常规间隔向客户端发送一些信息。 我遵循了这里的教程 - https://spring.io/guides/gs/messaging-stomp-websocket/ 按照上述教程,客户端启动了一个http请求,该请求被升级为websocket。
在我的情况下,前端是一个angular 10应用程序,前端开发人员喜欢使用rxjs/websocket
,不想使用SockJS client
,因为他确信我们不需要支持任何旧版浏览器,这就是我被卡住的地方。
显然,rxjs/websocket
需要在ws://
协议中指定URL。
从以下代码片段中,我认为我的等效ws协议应该是
ws://localhost:8080/test
然而,它似乎不起作用。我不知道哪里出了问题。非常感谢你能提供任何帮助!
@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig implements WebSocketMessageBrokerConfigurer
{
@Override
public void configureMessageBroker(MessageBrokerRegistry config)
{
config.enableSimpleBroker("/topic");
config.setApplicationDestinationPrefixes("/ws/");
@Override
public void registerStompEndpoints(StompEndpointRegistry registry)
{
registry.addEndpoint("/test");
}
}
根据教程,我更改了app.js
如下以测试这个功能。
function connect() {
// var socket = new SockJS('http://localhost:8080/test'); This works perfectly
// stompClient = Stomp.over(socket);
ws = new WebSocket('ws://localhost:8080/test');
stompClient = Stomp.client(ws);
stompClient.connect({}, function (frame) {
setConnected(true);
console.log('Connected: ' + frame);
stompClient.subscribe('/topic/' + $("#site").val(), function (message) {
showMessageSentFromServer(JSON.stringify(message.body));
});
});
}
当我打开chrome的开发者工具并进行检查时,我看到websocket连接已经建立并升级,至少我是这么认为的。但是,在控制台中,我看到以下错误日志。我不确定出了什么问题。
网络截屏:
控制台失败日志:
stomp.min.js:8 Uncaught DOMException: Failed to construct 'WebSocket': The URL '[object WebSocket]' is invalid.
at Object.client (http://localhost:8080/webjars/stomp-websocket/stomp.min.js:8:7229)
at connect (http://localhost:8080/app.js:18:25)
at HTMLButtonElement.<anonymous> (http://localhost:8080/app.js:54:9)
at HTMLButtonElement.dispatch (http://localhost:8080/webjars/jquery/jquery.min.js:3:10315)
at HTMLButtonElement.q.handle (http://localhost:8080/webjars/jquery/jquery.min.js:3:8342)
长话短说,我通过删除 withSockJS()
成功禁用了服务器端的 SockJs。那么我的等效 ws
协议 URL 是什么?
此外,我还有另一个挑战,就是如何设置一个定时过程,该过程可以根据客户端的输入向已订阅的 Websocket 主题发送消息。我知道使用 @Scheduled
注释很容易设置定时过程。但在我的情况下,我需要一些来自客户端的输入,这些输入在定时过程中是必需的。
此外,请分享您拥有的任何资源或示例,说明如何使用 rxjs
实现 Websocket stomp 客户端订阅主题。
var url = "ws://localhost:15674/ws"; var client = Stomp.client(url);
- 你应该传递一个 url 字符串而不是已经创建好的 websocket 对象。 - artur grzesiakws = new webSocket('ws://localhost:8080/test')
。 - Constantin Konstantinidis