带有 Sockjs 和 Spring 4 但没有 Stomp 的 WebSocket
Posted
技术标签:
【中文标题】带有 Sockjs 和 Spring 4 但没有 Stomp 的 WebSocket【英文标题】:WebSocket with Sockjs & Spring 4 but without Stomp 【发布时间】:2015-01-25 07:25:48 【问题描述】:有没有办法将 WebSockets 与 SockJS 客户端和 Spring 4 服务器一起使用,但不使用 STOMP?
根据 Spring 网站上的本教程,我知道如何使用 Stomp 和 Spring 4 设置基于 WebSocket 的应用程序。在客户端,我们有:
var socket = new SockJS('/hello');
stompClient = Stomp.over(socket);
stompClient.connect(, function(frame)
setConnected(true);
console.log('Connected: ' + frame);
stompClient.subscribe('/topic/greetings', function(greeting)
showGreeting(JSON.parse(greeting.body).content);
);
);
在服务器端,我们在控制器中有以下内容:
@MessageMapping("/hello")
@SendTo("/topic/greetings")
public Greeting greeting(HelloMessage message) throws Exception
Thread.sleep(3000); // simulated delay
return new Greeting("Hello, " + message.getName() + "!");
现在,我知道@MessageMapping("/hello")
确保如果将消息发送到目标"/hello"
,则将调用greeting()
方法。由于stompClient
订阅了"/topic/greetings"
,@SendTo("/topic/greetings")
会将消息发送回stompClient
。
但是上面的问题是 stompClient 是一个 Stomp 对象。我想简单地使用sock.send('test');
并将其传送到我的服务器的目的地。而我想做@SendTo("myownclientdestinationmap")
,可以通过
sock.onmessage = function(e)
console.log('message', e.data);
;
那么,有什么方法可以使用 Spring 4、SockJS 而没有 Stomp?还是 Spring 4 WebSocket 只支持 Stomp?
【问题讨论】:
我想在我的spring-mvc
应用程序中使用WebSocket,你能指导/告诉我为什么你不想使用STOMP
吗?谢谢!!!
【参考方案1】:
Spring 支持 STOMP
而不是 WebSocket
但子协议的使用不是强制性的,您可以处理原始 websocket。使用原始 websocket 时,发送的消息缺少信息以使 Spring 将其路由到特定的消息处理程序方法(我们没有任何消息传递协议),因此您不必注释控制器,而是必须实现 @987654323 @:
public class GreetingHandler extends TextWebSocketHandler
@Override
public void handleTextMessage(WebSocketSession session, TextMessage message)
Thread.sleep(3000); // simulated delay
TextMessage msg = new TextMessage("Hello, " + message.getPayload() + "!");
session.sendMessage(msg);
然后将您的处理程序添加到配置中的注册表中(您可以添加多个处理程序并使用SockJS
作为备用选项):
@Configuration
@EnableWebSocket
public class WebSocketConfig implements WebSocketConfigurer
@Override
public void registerWebSocketHandlers(WebSocketHandlerRegistry registry)
registry.addHandler(greetingHandler(), "/greeting").withSockJS();
@Bean
public WebSocketHandler greetingHandler()
return new GreetingHandler();
客户端会是这样的:
var sock = new SockJS('http://localhost:8080/greeting');
sock.onmessage = function(e)
console.log('message', e.data);
【讨论】:
这正是我想要的。谢谢! 你好@Sergi Almar,我有一个问题,使用spring 4是否可以使用new WebSocket('ws://localhost:8080/my-app/ws-connect-url');
连接到网络套接字?
当然,只需删除 .withSockJS();从配置中使用普通的 JS WebSocket API(你不会有任何后备选项)
这个答案很好用,但我现在想知道:在这个设置中是否可以向所有连接的客户端广播消息?在普通的 JSR356 websockets 中它很简单,所以我希望它在这里也是可行的。
没有 .withSockJS() 对我不起作用 -> 无法使用“ws://localhost....”进行连接,您能帮忙吗?我正在使用弹簧靴以上是关于带有 Sockjs 和 Spring 4 但没有 Stomp 的 WebSocket的主要内容,如果未能解决你的问题,请参考以下文章
Spring-Websockets 4.2 中使用 SockJS 的部分消息
Spring with STOMP over SockJS 和 Tomcat 未升级到 Websockets
没有 SockJS/StompJS 的 Spring STOMP 服务器