最近項目中需要用到mes和本地客戶端進行實時通訊,本來想用webapi進行交互的,但是考慮到高效和實時性,就采用這一項技術。
以往采用的方式——長輪詢
客戶端主動向服務器發送一個請求,如果服務器沒有更新的數據,客戶端等待,其中就會存在各個客戶端請求等待的問題(await),然后服務器壓力就會增加。如果服務器有數據或者超時了,此時客戶端得到數據或者返回,并發起下一輪請求。
websocket簡介
WebSocket是一個在HTML5中提出的一個高效的全雙工實時通訊協議,其出現的意義是可以解決Web應用程序和桌面應用程序的實時通信,也就是(C/S)和(B/S)的交互。
其底層是基于TCP實現的通信,服務器和客戶端之間的連接只需要一次握手,不再像之前socket通訊的時候需要三次握手。
以上有什么好處呢?就是我不在需要去輪詢服務器發送的內容了,能夠節省服務器的資源和貸款,并且具備一定的實時性。
Http/2的支持
基于 HTTP/2 的 WebSockets 具有如下新功能:
(1). 標頭壓縮。
(2). 多路復用,可減少向服務器發出多個請求時所需的時間和資源。
(3). 使用二進制數據高效傳輸。
當進行開發的時候,chrome和edge都是默認啟用http/2 WebSocket的.
Http與WebSocket的關系
兩者都是基于TCP協議上的應用層協議,其關系有如圖
通過圖可知,http和websocket都是建立在TCP之上實現數據的傳輸,但是應用場景是不同的,其
(1). WebSocket 是雙向通信協議,實現服務和客戶端雙向發送或接收信息。
(2). HTTP 是單向通信協議,客戶端發出請求,服務器才能接收請求并處理。
(3). WebSocket 的通信需要客戶端與服務器進行握手建立連接,連接是持久
的,可以在連接通道中雙向發送和接收消息。
(4). HTTP 不需要握手,只能是客戶端先發起請求給服務器,服務器事先并不
知哪個連接會過來,服務器處理后二者斷開,再無瓜葛。
(5). WebSocket 是服務器和客戶端都可以主動推送消息,無主次之分,也無先
后之分,而 HTTP 是客戶端主動發送請求,服務器被動處理并響應。
?也就是說,只要建立連接,websockt不需要通過http進行收發,而是通過tcp進行全雙工通信。
前面介紹了長輪詢,當我們在生產環境中需要實時性時,此時請求推送和等待收發會發生延遲,不但增加服務器壓力,還會影響現場生產的節拍。那websocket的原理就是
客戶端向服務端請求一次TCP連接,HTTP請求包含了一些信息,連接成功之后雙方互相通知連接成功,此時可以隨時收發數據。
?當我們有多個設備同時向服務端請求時,如果采用原先長輪詢的技術,需要存在多個信道,而采用websocket只需要建立一次連接信道,就可以在同一個信道內持久地收發消息,且不存在等待的情況。
所以,在了解了以上情況之后,果斷采用此解決方案。