HTTP協議是“請求-響應”模式,瀏覽器必須先發請求給服務器,服務器才會響應該請求。即服務器不會主動發送數據給瀏覽器。
實時性要求高的應用,如在線游戲、股票實時報價和在線協同編輯等,瀏覽器需實時顯示服務器的最新數據,因此出現Ajax和Comet技術:
- Ajax本質還是輪詢
- Comet基于HTTP長連接做了一些hack
但它們實時性不高,頻繁請求也會給服務器巨大壓力,也浪費網絡流量和帶寬。于是HTML5推出WebSocket標準,使得瀏覽器和服務器之間任一方都可主動發消息給對方,這樣服務器有新數據時可主動推給瀏覽器。
WebSocket原理
網絡上的兩個程序通過一個雙向鏈路進行通信,這個雙向鏈路的一端稱為一個Socket。一個Socket對應一個IP地址和端口號,應用程序通常通過Socket向網絡發出或應答網絡請求。
Socket不是協議,是對TCP/IP協議層抽象出來的API。
WebSocket跟HTTP協議一樣,也是應用層協議。為兼容HTTP協議,它通過HTTP協議進行一次握手,握手后數據就直接從TCP層的Socket傳輸,與HTTP協議再無關。
這里的握手指應用協議層,不是TCP層,握手時,TCP連接已建立。 即HTTP請求里帶有websocket的請求頭,服務端回復也帶有websocket的響應頭。
瀏覽器發給服務端的請求會帶上跟WebSocket有關的請求頭,比如Connection: Upgrade和Upgrade: websocket
若服務器支持WebSocket,同樣會在HTTP響應加上WebSocket相關的HTTP頭部:
這樣WebSocket連接就建立好了。
WebSocket的數據傳輸以frame形式傳輸,將一條消息分為幾個frame,按先后順序傳輸出去。為何這樣設計?
- 大數據的傳輸可以分片傳輸,無需考慮數據大小問題
- 和HTTP的chunk一樣,可邊生成數據邊傳輸,提高傳輸效率
Tomcat如何支持WebSocket
鏈接:https://juejin.cn/post/7095918534210879519
Java實現WebSocket的兩種方式?
參考?https://www.cnblogs.com/onlymate/p/9521327.html