2017-04-20 97 views
1

我有支持Spring Websocket的Spring服務器。我想用STOMP子協議來處理在網絡套接字通信,所以STOMP端點的配置看起來如下:沒有SockJS/StompJS的Spring 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簡單網絡套接字客戶端插件連接到我的STOMP服務器。根據STOMP規範,我所做的第一件事是打開網絡套接字連接。我

WS做到這一點://my.server.here/chat/websocket

鏈接。這部分工作和我的連接建立。現在我想使用STOMP。同樣作爲STOMP規範說我現在應該發送CONNECT命令,如下所示(STOMP 1.1):

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

^@ 

然後,我希望從與所連接的命令服務器的響應,但我什麼也沒得到。如果不是「CONNECT」,我會使用一些不存在的命令,比如「WRONG_COMMAND」,那麼我可以看到有關未知命令的Spring異常,所以我想我的消息觸及Spring的Websocket內部,但我無法得到任何回報。如果這可行,我希望使用後續的SEND,SUBSCRIBE等命令來執行操作。

這種工作流程甚至可能嗎?我做錯了什麼,或者我錯誤地解決了整個想法和它的工作方式?

+0

你解決了這個問題嗎? – sjbwylbs

+0

我沒有用Google Websocket客戶端解決它,但是我使用了不使用SockJS的移動應用程序。我發佈了完整的答案和更詳細的說明。隨意問你是否還有其他問題。 – Plebejusz

回答

0

我已經解決了這個問題,所以簡短的回答是是的,您可以使用Spring的STOMP消息傳遞,而不需要SockJS,只需向websocket端點發送適當的構造消息即可。

較長的回答是,我無法與谷歌簡單的WebSocket客戶端要做到這一點,從STOMP語法手段^@人物,從STOM文檔引用:本文檔中

例子都將使用^ @,控制 - ASCII中的@表示NULL八位字節。

谷歌的Websocket客戶端的問題是,我認爲,我真的不能發送這個空的八位字節,所以我的STOMP消息沒有正確終止。

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

我們將Xamarin與C#用於移動應用程序開發。連接到STOMP就是這樣完成的。請注意,我們首先打開到WebSocket的定期聯繫,我們去蹬處理時,它的建立:

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

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

webSocketConnection.Send("\n"); 

我們使用this作爲我們的WebSocket客戶端。

這只是基於此,我們建立了完全支持連接與Spring的Websockets沒有SockJS,隨時問如果你有進一步的問題。積分Mateusz Gaffke幫助和實施移動端。

相關問題