介紹
websocket是乙個持久化協議,相對於http這種非持久協議而言。它實現了瀏覽器與伺服器全雙工通訊,能更好的節省伺服器資源和頻寬並達到實時通訊的目的,與http一樣基於已建立的tcp連線來傳輸資料。但是與http協議不同的地方就是:websocket是一種雙向通訊協議,在建立連線後,websocket伺服器端和客戶端都能主動向對方傳送或接收資料,就像socket一樣;websocket需要像tcp一樣,先建立連線,連線成功後才能相互通訊。
執行機制
傳統的http客戶端與伺服器請求響應模式,乙個生命週期裡只有乙個或多個請求和乙個或多個與之對應的響應。 如下所示:
而websocket模式下客戶端與伺服器響應模式,一旦websocket連線建立,在客戶端或者服務端中斷連線前,資料都以幀序列傳輸,不需要重啟客戶端或者服務端重新發起連線請求。
1.客戶端發起請求
request method:getstatus code:101 switching protocols #101之後的資料傳輸採用websocket協議
connection
:upgrade
sec-websocket-extensions:permessage-deflate;
sec-websocket-key
:dfqay9mlq0ejd5mmvvszaq== #驗證
sec-websocket-version:13
upgrade:websocket #客戶端支援websocket協議,如果伺服器也支援就使用websocket協議
2.伺服器解析,並返回握手資訊,建立連線
connection:upgrade
sec-websocket-accept:+mkc4huknifmgjfozclp9fo058g= #驗證
upgrade:websocket
3.傳輸資料(雙向)
4.斷開連線
應用場景
websocket屬於web領域的實時推送技術,目的讓使用者不重新整理瀏覽器就可以實時更新。其在容器化管理平台裡主要有兩個應用場景型別,乙個是實時訊息類,將實時日誌、業務監控等相關資訊推送給客戶端。如:在容器化管理平台裡部署了乙個應用,那麼應用部署的日誌、執行日誌以及監控資訊如何及時推送到前端呢,另外乙個就是互動訊息類,在web介面操作容器,節省手動登入伺服器進入容器內的時間,提高效率。
例項1:實時訊息
就拿雲幫而言,需要實時推送的是每個應用的日誌資訊和業務監控資料。那麼我們在處理實時訊息時就採用了websocket與zmq相結合的方式,快速實現將應用日誌資訊推送到web端。其簡化模型如下所示:
客戶端與伺服器採用websocket協議,實時傳輸相關資料。相關資料方面採用的是zmq。雲幫主要使用了zeromq訊息佇列中的publisher-subscriber模型,將所有相關資訊彙總到乙個節點上在推送到其他節點上。即客戶端(sub)向伺服器(pub)訂閱訊息,然後伺服器將訊息推送到所有訂閱了訊息到客戶端,類似於廣播。之所以採用zmq,而不是socket的原因,前者支援n:m的連線,後者只能1:1的連線。其訊息佇列模型示意圖:
具體的應用場景相關設定引數:
#config.py 定義實時訊息url
websocket_url =
#dalaran_docker
zmq_bind_sub=tcp:
zmq_bind_pub=tcp:
zmq_bind_pub2=tcp:
#setting
'docker_sub'
: ,
例項2:互動訊息
gotty是乙個用go語言開發的工具,可以將作業系統的命令字元終端共享成普通的網頁應用展示出來。 在mac安裝根據情況選擇一種
使用:
gotty -a 0.0.0.0 -p那麼在雲幫,我們又是如何解決這個問題的? 雲幫web端操作容器就是基於gotty定製開發的websocket共享字元終端。 建立乙個websocket例項,連線伺服器進行前後臺互動及相關事件處理
#前端實現部分**var openws = function
()
var url = tmp_url.replace
("}"
,host_name)
console.log(url)
var ws = new websocket(url);
var term;
var pingtimer;
ws.onopen = function
(event) ));
pingtimer = setinterval(sendping, 30 * 1000, ws);
hterm.defaultstorage = new lib.storage.local
();
hterm.defaultstorage.clear();
term = new hterm.terminal();
term.getprefs().set
("send-encoding"
, "raw"
); term.onterminalready = function
() ;
io.sendstring = io.onvtkeystroke;
io.onterminalresize = function
(columns,
rows
) )
) };
term.installkeyboard();
}; term.decorate(document.getelementbyid("terminal"
));
}; 後端程式基於gotty開發的。
WebSocket在容器化管理平台的應用
介紹 websocket是乙個持久化協議,相對於http這種非持久協議而言。它實現了瀏覽器與伺服器全雙工通訊,能更好的節省伺服器資源和頻寬並達到實時通訊的目的,與http一樣基於已建立的tcp連線來傳輸資料。但是與http協議不同的地方就是 websocket是一種雙向通訊協議,在建立連線後,web...
在python中使用websocket
介紹一款很帥的外掛程式autobahnpython,通過它可以在python中很方便的使用websocket進行通訊 基於twisted框架 這個外掛程式真正強大的地方是它提供了乙個 發布 訂閱模式,具體內容有空再寫,先簡單介紹一下如何建立傳統的連線。建立伺服器 必須的模組 from twisted...
在WCF中使用websocket
今天在網上閒逛的時候,發現wcf4.5中新增了乙個nethttpbinding協議,它是支援websocket的。在網上找了一下教程,附上codeproject上的兩篇文章 其中第一篇文章是使用soap協議來封裝訊息的,實現了乙個基於websocket的雙工通訊程式。第二篇文章則是直接使用文本來通訊...