WebSocket with Sockjs & Spring 4,但没有Stomp

2022-09-01 03:08:03

有没有办法将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?


答案 1

弹簧支持过,但使用子协议不是强制性的,你可以处理原始的websocket。当使用原始websocket时,发送的消息缺少信息来使Spring将其路由到特定的消息处理程序方法(我们没有任何消息传递协议),因此您必须实现一个:STOMPWebSocketWebSocketHandler

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

答案 2

推荐