WebSocket with Sockjs & Spring 4 but without Stomp

假如想象 提交于 2019-11-26 10:12:49

问题


Is there a way to use WebSockets with SockJS client and Spring 4 server but not using STOMP?

Based on this tutorial from Spring\'s website, I know how to set up a WebSocket based application using Stomp and Spring 4. On the client side, we have:

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

And on the server side, we have the following in the controller:

@MessageMapping(\"/hello\")
@SendTo(\"/topic/greetings\")
public Greeting greeting(HelloMessage message) throws Exception {
    Thread.sleep(3000); // simulated delay
    return new Greeting(\"Hello, \" + message.getName() + \"!\");
}

Now, I understand that @MessageMapping(\"/hello\") ensures that if a message is sent to a destination \"/hello\", then the greeting() method will be called. And since the stompClient is subscribed to \"/topic/greetings\", the @SendTo(\"/topic/greetings\") will send the message back to the stompClient.

But the problem with the above is that stompClient is a Stomp object. And I want to simply use sock.send(\'test\'); and have it delivered to my server\'s destination. And I want to do @SendTo(\"myownclientdestinationmap\"), I can receive it by

sock.onmessage = function(e) {
     console.log(\'message\', e.data);
 };

So, any way to do this with Spring 4, SockJS and without Stomp? Or does Spring 4 WebSocket only supports Stomp?


回答1:


Spring supports STOMP over WebSocket but the use of a subprotocol is not mandatory, you can deal with the raw websocket. When using a raw websocket, the message sent lacks of information to make Spring route it to a specific message handler method (we don't have any messaging protocol), so instead of annotating your controller, you'll have to implement a 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);
    }
}

And then add your handler to the registry in the configuration (you can add more than one handler and use SockJS for fallback options):

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

The client side will be something like this:

var sock = new SockJS('http://localhost:8080/greeting');

sock.onmessage = function(e) {
    console.log('message', e.data);
}


来源:https://stackoverflow.com/questions/27158106/websocket-with-sockjs-spring-4-but-without-stomp

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!