有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

带有Sockjs和spring4但没有Stomp的javawebsocket

有没有一种方法可以在SockJS客户端和Spring4服务器上使用WebSocket,但不使用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);
 };

那么,用Spring4、SockJS和Stomp做这件事有什么方法吗?还是Spring4WebSocket只支持跺脚


共 (1) 个答案

  1. # 1 楼答案

    Spring支持STOMP而不是WebSocket,但是子目录的使用不是强制性的,您可以处理原始websocket。使用原始websocket时,发送的消息缺少信息,无法使Spring将其路由到特定的消息处理程序方法(我们没有任何消息传递协议),因此,您必须实现一个WebSocketHandler,而不是注释控制器:

    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);
    }