WebSocket
什麼是WebSocket?
WebSocket爲瀏覽器和服務端提供了雙工異步通信的功能,即瀏覽器可以向服務端發送消息,服務端也可以向瀏覽器發送消息。
WebSocket需要瀏覽器的支持,如IE 10+、Chrome 13+、Firefox 6+……
WebSocket是通過一個socket來實現雙工異步通信能力的。但是直接使用WebSocket(或者SockJS:WebSocket協議的模擬,增加了當瀏覽器不支持WebSocket的時候的兼容支持)
協議開發程序顯得特別繁瑣,我們會使用它的子協議STOMP,它是一個更高級別的協議,STOMP協議使用一個基於幀(frame)的格式定義消息,與HTTP的request和response類似(具有類似於@RequestMapping的@MessageMapping)
Spring Boot 提供的自動配置
Spring Boot 對內嵌的Tomcat(7或者8)、Jetty9和Undertow使用WebSocket提供了支持。
配置源碼存於org.springframework.boot.autoconfigure.websocket下:
Spring Boot爲WebSocket提供的starter pom是spring-boot-starter-websocket
廣播式:
廣播式即服務端有消息時,會發消息發送給所有連接了當前endpoint的瀏覽器。
(1)配置WebSocket,需要在配置類上使用@EnableWebSocketMessageBroker開啓WebSocket支持,並通過AbstractWebSocketMessageBrokerConfigurer類,重寫其方法來配置WebSocket。
(2)瀏覽器向服務端發送的消息用此類接收
(3)服務器向瀏覽器發送的此類的消息:
(4)演示控制器:
(5)添加腳本。將stomp.min.js(STOMP協議的客戶端腳本)、sockjs.min.js(SockJS的客戶端腳本)以及jQuery放置在src/main/resources/static下。
(6)演示頁面(在src/main/resources/templates下新建ws.html)
(7)配置viewController,爲ws.html提供便捷的路徑映射:
(8)運行。結果發現:當一個瀏覽器發送一個消息到服務端時,其他瀏覽器也能接收到從服務端發送來的這個消息。
(9)在Chrome瀏覽器下觀察STOMP的幀(也可以從控制檯上打印的data數據來看)
連接服務端的格式爲:
連接成功的返回爲:
向目標(destination)/welcome 發送消息的格式爲:
紅色框中就是要發送的消息。
從目標(destination)/topic/getReponse:
從目標(destination)/topic/getResponse接收的格式爲: