更新時間:2023年07月06日11時37分 來源:傳智教育 瀏覽次數(shù):
WebSocket 是基于 TCP 的一種新的網(wǎng)絡(luò)協(xié)議。它實現(xiàn)了瀏覽器與服務(wù)器全雙工通信——瀏覽器和服務(wù)器只需要完成一次握手,兩者之間就可以創(chuàng)建持久性的連接, 并進行雙向數(shù)據(jù)傳輸。
HTTP協(xié)議和WebSocket協(xié)議對比:
HTTP是短連接,WebSocket是長連接。
HTTP通信是單向的,基于請求響應(yīng)模式。WebSocket支持雙向通信。
HTTP和WebSocket底層都是TCP連接。
那既然WebSocket支持雙向通信,功能看似比HTTP強大,那么我們是不是可以基于WebSocket開發(fā)所有的業(yè)務(wù)功能?
不能,WebSocket并不能完全取代HTTP,WebSocket服務(wù)器長期維護長連接需要一定的成本,各個瀏覽器支持程度不一。WebSocket 是長連接,受網(wǎng)絡(luò)限制比較大,需要處理好重連,它只適合在特定的場景下使用。
下面以外賣平臺商家端的來單提醒為例,演示W(wǎng)ebSocket的使用。
需求分析和設(shè)計
用戶下單并且支付成功后,需要第一時間通知外賣商家。通知的形式有語音播報和彈出提示框兩種。
通過WebSocket實現(xiàn)管理端頁面和服務(wù)端保持長連接狀態(tài),當(dāng)客戶支付后,調(diào)用WebSocket的相關(guān)API實現(xiàn)服務(wù)端向客戶端推送消息。客戶端瀏覽器解析服務(wù)端推送的消息,判斷是來單提醒還是客戶催單,進行相應(yīng)的消息提示和語音播報。
約定服務(wù)端發(fā)送給客戶端瀏覽器的數(shù)據(jù)格式為JSON,字段包括:type,orderId,content
- type 為消息類型,1為來單提醒 2為客戶催單。
- orderId 為訂單id。
- content 為消息內(nèi)容。
在OrderServiceImpl中注入WebSocketServer對象,修改paySuccess方法,加入如下代碼:
Map map = new HashMap(); map.put("type", 1);//通知類型 1來單提醒 2客戶催單 map.put("orderId", orders.getId());//訂單idmap.put("content","訂單號:" + outTradeNo); webSocketServer.sendToAllClient(JSON.toJSONString(map));
添加代碼后查看瀏覽器調(diào)試工具數(shù)據(jù)交互過程,和前后端聯(lián)調(diào)情況,顯示正常則表示添加成功。