【发布时间】:2021-08-27 09:58:56
【问题描述】:
我已经为此苦苦挣扎了至少两个星期。我对 websockets 很陌生。我在休息端点方面有很好的经验。
我的用例很简单。客户端启动一个 websocket 连接,向服务器发送一些信息,服务器使用该信息,并每隔 5 秒定期向客户端发送一些信息。 我按照这里的教程 - https://spring.io/guides/gs/messaging-stomp-websocket/ 正如解释的那样,它完美地工作。 按照上面的教程,客户端发起一个http请求,升级为websocket。
在我的例子中,前端是一个 Angular 10 应用程序,前端开发人员更喜欢使用 rxjs/websocket 而不想使用 SockJS client,因为他确信我们不必支持任何旧版浏览器,这就是我感到震惊的地方。
显然rxjs/websocket 需要ws:// 协议中的url。
从下面的 sn-p 中,我认为我的等效 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 客户端订阅
【问题讨论】:
-
来自stomp docs:
var url = "ws://localhost:15674/ws"; var client = Stomp.client(url);- 你应该只传递 url 字符串而不是已经创建的 websocket 对象。 -
发布的代码似乎没有使用Rxjs websocket,因为它应该以
ws = new webSocket('ws://localhost:8080/test')等小写字母开头 -
@arturgrzesiak 你是我的救星!这似乎解决了我的问题。我才意识到这个错误是多么愚蠢,但价值一百万。非常感谢!
-
@arturgrzesiak 我很高兴将我的赏金奖励给你,如果你能在接下来的 3 小时内发表你的评论作为答案,因为我不能奖励回复。再次感谢。
标签: spring-boot websocket rxjs spring-websocket sockjs