WebSocket為瀏覽器和服務(wù)端提供了雙方異步通信的功能堪侯,讓瀏覽器可以向服務(wù)端發(fā)送消息,服務(wù)端也可以向?yàn)g覽器發(fā)送消息荔仁。WebSocket需要瀏覽器的支持伍宦,如IE10+芽死、Chrome13+、Firefox6+等次洼,這對(duì)于我們現(xiàn)在的瀏覽器來(lái)說(shuō)都不是問(wèn)題关贵。
WebSocket是通過(guò)一個(gè)socket來(lái)實(shí)現(xiàn)雙工異步通信能力的,但是直接使用WebSocket(或者SockJS:WebSocket的模擬卖毁,增加了當(dāng)瀏覽器不支持WebSocket的時(shí)候的兼容支持)協(xié)議開(kāi)發(fā)程序過(guò)于繁瑣揖曾,可以使用自斜陽(yáng)STOMP,它是一個(gè)更高級(jí)別的協(xié)議亥啦,STOMP協(xié)議使用一個(gè)基于幀(frame)的格式來(lái)定義消息炭剪,與HTTP的request和response類似(具有類似于@RequestMapping和@MessageMapping)。
首先新建一個(gè)項(xiàng)目禁悠,添加WebSocket依賴:
廣播式
即服務(wù)端有消息時(shí)念祭,會(huì)將消息發(fā)送給所有連接了當(dāng)前endpoint的瀏覽器。
(1)配置WebSocket碍侦,需要在配置類上使用@EnableWebSocketMessageBroker 開(kāi)啟WebSocket支持,并通過(guò)繼承AbstractWebSocketMessageBrokerConfigurer類隶糕,重寫(xiě)其方法來(lái)配置WebSocket瓷产。如圖:
(2)瀏覽器向服務(wù)端發(fā)送的消息用此類接受:
(3)服務(wù)端向?yàn)g覽器發(fā)送的此類的消息:
(4)演示控制器
(5)添加腳本。將stomp.min.js(STOMP協(xié)議的客戶端腳本)枚驻、sockjs.min.js(SockJS的客戶端腳本)以及jQuery放置在src/main/resources/static 目錄下濒旦。可以自行下載這些腳本文件再登。
(6)演示頁(yè)面尔邓。在 src/main/resources/templates 目錄下新建ws.html文件,代碼如下:
(7)配置Controller锉矢,為ws.html提供便捷的路徑映射:
(8)運(yùn)行梯嗽。廣播的預(yù)期效果是,一個(gè)瀏覽器發(fā)送消息沽损,多個(gè)瀏覽器都能接收到返回消息〉平冢現(xiàn)在開(kāi)啟三個(gè)瀏覽器,并連接:
現(xiàn)在在第一個(gè)里面發(fā)送名字绵估,
可以看到炎疆,所有瀏覽器都接收到了返回的消息!
點(diǎn)對(duì)點(diǎn)式
廣播式應(yīng)用廣泛国裳,但是不能解決消息誰(shuí)發(fā)送誰(shuí)接收的問(wèn)題形入,因此需要點(diǎn)對(duì)點(diǎn)的消息推送模式。
(1)下面演示一個(gè)聊天室缝左,需要兩個(gè)用戶亿遂。因?yàn)橛脩粝嚓P(guān)螟蒸,所以引入security:
(2)加入security簡(jiǎn)單配置,不做過(guò)多說(shuō)明崩掘,只在代碼中注釋解釋有用的部分:
(3)配置WebSocket:
(4)控制器七嫌。在WsController內(nèi)增加如下代碼:
(5)登錄頁(yè)面。在 src/main/resources/templates下新建 login.html苞慢,如下:
(6)聊天頁(yè)面诵原。在src/main/resources/templates下新建chat.html頁(yè)面,如下:
(7)增加頁(yè)面的viewController:
(8)運(yùn)行挽放。首先進(jìn)入登錄頁(yè)面绍赛,兩個(gè)用戶各自登錄,如圖:
登錄成功辑畦,進(jìn)入聊天室吗蚌,如圖:
現(xiàn)在分別互相發(fā)送消息,可以看到各自都能接收纯出,如圖:
這就是基于點(diǎn)對(duì)點(diǎn)的消息模式蚯妇。