带有 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 服务器

Java Glassfish Spring Sockjs失败:WebSocket握手期间出错:意外的响应代码:500

Spring 和 SockJs 的控制器组件问题

websocket-spring 整合