簡體   English   中英

沒有SockJS / StompJS的Spring STOMP服務器

[英]Spring STOMP server without SockJS/StompJS

我有Spring服務器支持Spring Websocket。 我想使用STOMP子協議來處理通過Web套接字的通信,因此STOMP端點的配置如下所示:

@Configuration
@EnableWebSocketMessageBroker
public class WebSocketConfig extends AbstractWebSocketMessageBrokerConfigurer {

    @Override
    public void registerStompEndpoints(StompEndpointRegistry registry) {
        registry.addEndpoint("/chat")
                .setAllowedOrigins("*")
                .withSockJS();
    }
}

Spring文檔和基本上我能夠找到的主題的任何資源都顯示了如何使用SockJS + StompJS創建STOMP客戶端。 它的工作原理,但據我所知它根本不需要 - 因為STOMP只是一個子協議,我應該能夠通過使用STOMP消息語法基本上從任何Web套接字客戶端與我的服務器進行通信。

假設我只想從Google Chrome Simple Web Socket Client插件連接到我的STOMP服務器。 根據STOMP規范,我做的第一件事是打開Web套接字連接。 我這樣做

WS://my.server.here/chat/websocket

鏈接。 這部分工作,我的連接建立。 現在我想使用STOMP。 再次,因為STOMP規范說我現在應該發送CONNECT命令,如下所示(STOMP 1.1):

CONNECT
accept-version:1.0,1.1
host:my.host.here

^@

然后我希望服務器使用CONNECTED命令響應,但我什么都沒得到。 如果不是“CONNECT”,我將使用一些不存在的命令,如“WRONG_COMMAND”,那么我可以看到Spring異常被拋出未知命令,所以我想我的消息擊中了Spring的Websocket內部,但我無法得到任何回報。 如果這可行,我想使用后續的SEND,SUBSCRIBE等命令來執行操作。

這種工作流程甚至可能嗎? 我做錯了什么,或者我錯誤地解決了整個想法及其運作方式?

我已經解決了這個問題,所以簡短的回答是肯定的,你可以在沒有SockJS的情況下使用Spring的STOMP消息 ,只需將相應的構造消息發送到websocket端點即可。

更長的答案是我無法使用Google Simple Websocket Client執行此操作,因為STOMP語法中的^@字符意味着引用STOM文檔:

本文檔中的示例將使用ASCII中的^ @,control- @來表示NULL八位字節。

我認為谷歌的Websocket客戶端的問題是我真的無法用它發送這個空的八位字節,所以我的STOMP消息沒有被正確終止。

我需要它來為一個無法使用SockJS的移動應用程序進行簡單的聊天,並且在我的公司移動開發人員的幫助下,我們能夠編寫工作解決方案,這基本上只是一個與STOMP子協議兼容的消息格式化程序。

我們使用Xamarin和C#進行移動應用程序開發。 連接到STOMP是這樣完成的。 請注意,我們首先打開與websocket的常規連接,並在建立時進行STOMP處理:

var connectString = String.Format("CONNECT\naccept-version:1.0,1.1\nlogin:{0}\nheart-beat:30000,0\n\n\0", AuthService.TOKEN);
webSocketConnection = Websockets.WebSocketFactory.Create();
webSocketConnection.OnOpened += () => 
{
    webSocketConnection.Send(connectString);
    Debug.WriteLine("opened");
};

您必須使用客戶端onMessage方法處理來自服務器的響應,或者它是等效的。 建立連接后,您可以像這樣發送STOMP消息,例如我們在應用程序中執行此操作:

var messageString = String.Format("SEND\ndestination:/app/chat/send/{0}\nlogin:{1}\n\n{{\"message\":\"{2}\"}}\n\0", chatName, AuthService.TOKEN, message);
webSocketConnection.Send(messageString);

還記得你可能需要支持心跳,所以后端不會斷開你的應用程序認為它已經死了。 在我們的移動應用程序中,我們從另一個線程發送心跳。 Heartbeat只是一個發送到websocket地址的換行符。 請注意,它不包含任何STOMP標頭等:

webSocketConnection.Send("\n");

我們使用作為我們的websocket客戶端。

這只是我們在沒有SockJS的情況下完全支持與Spring的Websockets連接的基礎,隨時可以詢問您是否還有其他問題。 Mateusz Gaffke致力於幫助和實施移動端。

暫無
暫無

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

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