參考:Java NIO實現WebSocket服務器_nio websocket-CSDN博客
WebSocket API是HTML5中的一大特色,能夠使得建立連接的雙方在任意時刻相互推送消息,這意味著不同于HTTP,服務器服務器也可以主動向客戶端推送消息了。
WebSocket協議是在Http協議的基礎上升級而來的。
WebSocket協議建鏈過程:
Client端需要向服務器端發送一個Http請求,請求頭攜帶Connection: Upgrade以及Upgrade: websocket兩字段,用來告知服務器這是一個WebSocket握手請求。
我們可以使用JavaScript代碼,發起一個WebSocket鏈接請求,然后在瀏覽器F12查看請求信息如下:
服務端收到握手請求后,會返回有Connection和Upgrade字段來表明這是一個WebSocket數據包。響應狀態為101.
此時WebSocke鏈接已經建立,這是一個長連接,我們可以看下F12中websocket的狀態:
可以看到Time欄中顯示為Pending,等待用戶和服務器交互數據了。
此時我們可以在服務端再來看下接收到的請求日志:
(PS: 需要打開debug日志級別,同時需要顯示處理握手信息)
2024-05-23 15:45:39 DEBUG [NioWebSocketHandler] 收到消息:HttpObjectAggregator$AggregatedFullHttpRequest(decodeResult: success, version: HTTP/1.1, content: CompositeByteBuf(ridx: 0, widx: 0, cap: 0, components=0))
GET /websocket HTTP/1.1
Host: localhost:8081
Connection: Upgrade
Pragma: no-cache
Cache-Control: no-cache
User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/124.0.0.0 Safari/537.36
Upgrade: websocket
Origin: null
Sec-WebSocket-Version: 13
Accept-Encoding: gzip, deflate, br, zstd
Accept-Language: zh-CN,zh;q=0.9
Sec-WebSocket-Key: +iXe1OUXfWR045vV7eEOvA==
Sec-WebSocket-Extensions: permessage-deflate; client_max_window_bits
content-length: 0
可以看到服務端收到的確實是一個FullHttpRequest請求。
下面看下WebSocket數據交換過程:
客戶端瀏覽器發送數據后,服務端會返回一個響應:
還是在F12的websocket的Messages頁中可以看到Client發送和接收的消息
具體的客戶端和服務端的代碼,可以參考【GitCode - 開發者的代碼家園https://gitcode.com/Siwash/websocketWithNetty/blob/master/README.md】。