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 通訊,服務端,和客戶端都必須支持,服務端的準備步驟

服務端準備工作

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

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

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>