Spring Springboot實現websocket通訊-2

特別說明:1. 本文基於Springboot spring-boot-starter-parent 1.5.1.RELEASE編碼,在不同的版本中部分方法有區別。2. 因為博客字數限制,拆分成了兩篇文章


第一篇地址:Spring Springboot實現websocket通訊-1
第二篇地址:Spring Springboot實現websocket通訊-2



前面兩種建立websocket通訊,不管是用javax的包還是spring的包都是用的比較底層的協議,下面我們來看看用上層的STOMP來建立websocket通訊

SockJs+Spring-WebSocket時,由於SockJs與Spring WebSocket之間採用JSON通訊,需要引入jackson 2的相關jar包

<code>         
        
            com.fasterxml.jackson.core
            jackson-core
            2.6.3
        
        
            com.fasterxml.jackson.core
            jackson-databind
            2.6.3
        
        
            com.fasterxml.jackson.core
            jackson-annotations
            2.6.3
        /<code>

前面已經提到了STOMP是一個上層協議,STOMP 在 WebSocket 之上提供了一個基於 幀的線路格式層,用來定義消息語義。STOMP 幀:該幀由命令,一個或多個 頭信息 以及 負載所組成。如下就是發送 數據的一個 STOMP幀:

<code>SEND
destination:/app/marco
content-length:20
 
{"message":"hello word!"}/<code>
  • SEND:STOMP命令,表明會發送一些內容;
  • destination:頭信息,用來表示消息發送到哪裡;
  • content-length:頭信息,用來表示 負載內容的 大小;
  • 空行:
  • 幀內容(負載)內容
  • 要使用STOMP 通訊,服務端,和客戶端都必須支持,服務端的準備步驟

    服務端準備工作

    1. 我們已經配置了STOMP通訊的配置類 WebSocketStompConfig
    2. 配置了WebSocketChannelInterceptor 和 WebSocketHandshakeInterceptor 兩個自定義攔截器
    3. 一個WebSocketStompController 用於接收客戶端消息和響應客戶端
    4. 一個簡單的MVC controller 用於跳轉websocket 頁面

    在Spring中啟用STOMP通訊不用我們自己去寫原生態的幀,spring的消息功能是基於代理模式構建,其實說得複雜,都是封裝好了的,如果需要開啟SOMP,只需要在websocket配置類上使用@EnableWebSocketMessageBroker (註解的作用為能夠在 WebSocket 上啟用 STOMP),並實現WebSocketMessageBrokerConfigurer接口,有些教程在這一步會繼承AbstractWebSocketMessageBrokerConfigurer 類,我們看一下AbstractWebSocketMessageBrokerConfigurer類的源碼,可以看到都是空方法,也是實現的接口,這裡推薦自己實現接口,因為官方API上AbstractWebSocketMessageBrokerConfigurer已經標記為廢棄

    Spring Springboot實現websocket通訊-2

    AbstractWebSocketMessageBrokerConfigurer 抽象類

    <code>public abstract class AbstractWebSocketMessageBrokerConfigurer implements WebSocketMessageBrokerConfigurer {
        public AbstractWebSocketMessageBrokerConfigurer() {
        }
    
        public void configureWebSocketTransport(WebSocketTransportRegistration registration) {
        }
    
        public void configureClientInboundChannel(ChannelRegistration registration) {
        }
    
        public void configureClientOutboundChannel(ChannelRegistration registration) {
        }
    
        public boolean configureMessageConverters(List messageConverters) {
            return true;
        }
    
        public void addArgumentResolvers(List argumentResolvers) {
        }
    
        public void addReturnValueHandlers(List/<code>


    分享到:


    相關文章: