簡體   English   中英

WebSocket與Sockjs和Spring 4但沒有Stomp

[英]WebSocket with Sockjs & Spring 4 but without Stomp

有沒有辦法將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通過WebSocket支持STOMP ,但子協議的使用不是強制性的 ,您可以處理原始的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);
}

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM