03-webSocket學習

WebSocket 是什么于微?

  • WebSocket 是一種網絡通信協(xié)議。RFC6455 定義了它的通信標準。

  • WebSocket 是 HTML5 開始提供的一種在單個 TCP 連接上進行全雙工通訊的協(xié)議等脂。

為什么需要 WebSocket 裁奇?

  • 了解計算機網絡協(xié)議的人桐猬,應該都知道:HTTP 協(xié)議是一種無狀態(tài)的、無連接的刽肠、單向的應用層協(xié)議溃肪。它采用了請求/響應模型。通信請求只能由客戶端發(fā)起音五,服務端對請求做出應答處理惫撰。

  • 這種通信模型有一個弊端:HTTP 協(xié)議無法實現(xiàn)服務器主動向客戶端發(fā)起消息。

  • 這種單向請求的特點躺涝,注定了如果服務器有連續(xù)的狀態(tài)變化厨钻,客戶端要獲知就非常麻煩。大多數(shù) Web 應用程序將通過頻繁的異步 JavaScript 和 XML(AJAX)請求實現(xiàn)長輪詢。輪詢的效率低莉撇,非常浪費資源(因為必須不停連接呢蛤,或者 HTTP 連接始終打開)。

  • 因此棍郎,工程師們一直在思考其障,有沒有更好的方法。WebSocket 就是這樣發(fā)明的涂佃。WebSocket 連接允許客戶端和服務器之間進行全雙工通信励翼,以便任一方都可以通過建立的連接將數(shù)據(jù)推送到另一端。WebSocket 只需要建立一次連接辜荠,就可以一直保持連接狀態(tài)汽抚。這相比于輪詢方式的不停建立連接顯然效率要大大提高。

WebSocket 如何工作伯病?

  • Web 瀏覽器和服務器都必須實現(xiàn) WebSockets 協(xié)議來建立和維護連接造烁。由于 WebSockets 連接長期存在,與典型的 HTTP 連接不同午笛,對服務器有重要的影響惭蟋。

  • 基于多線程或多進程的服務器無法適用于 WebSockets,因為它旨在打開連接药磺,盡可能快地處理請求告组,然后關閉連接。任何實際的 WebSockets 服務器端實現(xiàn)都需要一個異步服務器癌佩。

WebSocket 客戶端

  • 在客戶端木缝,沒有必要為 WebSockets 使用 JavaScript 庫。實現(xiàn) WebSockets 的 Web 瀏覽器將通過 WebSockets 對象公開所有必需的客戶端功能(主要指支持 Html5 的瀏覽器)围辙。

客戶端 API

  • 以下 API 用于創(chuàng)建 WebSocket 對象我碟。
/*
 * param 
 * url@ 指定連接的 URL
 * protocol@ 是可選的,指定了可接受的子協(xié)議
*/
var Socket = new WebSocket(url, [protocol])

WebSocket 屬性

以下是 WebSocket 對象的屬性姚建。假定我們使用了以上代碼創(chuàng)建了 Socket 對象:

屬性 描述
Socket.readyState 只讀屬性 readyState 表示連接狀態(tài)怎囚,可以是以下值:0 - 表示連接尚未建立。1 - 表示連接已建立桥胞,可以進行通信恳守。2 - 表示連接正在進行關閉。3 - 表示連接已經關閉或者連接不能打開贩虾。
Socket.bufferedAmount 只讀屬性 bufferedAmount 已被 send() 放入正在隊列中等待傳輸催烘,但是還沒有發(fā)出的 UTF-8 文本字節(jié)數(shù)。

WebSocket 事件

以下是 WebSocket 對象的相關事件缎罢。假定我們使用了以上代碼創(chuàng)建了 Socket 對象:

事件 事件處理程序 描述
open Socket.onopen 連接建立時觸發(fā)
message Socket.onmessage 客戶端接收服務端數(shù)據(jù)時觸發(fā)
error Socket.onerror 通信發(fā)生錯誤時觸發(fā)
close Socket.onclose 連接關閉時觸發(fā)

WebSocket 方法

以下是 WebSocket 對象的相關方法伊群。假定我們使用了以上代碼創(chuàng)建了 Socket 對象:

方法 描述
Socket.send() 使用連接發(fā)送數(shù)據(jù)
Socket.close() 關閉連接

示例

// 初始化一個 WebSocket 對象
var ws = new WebSocket('ws://localhost:9998/echo')

// 建立 web socket 連接成功觸發(fā)事件
ws.onopen = function() {
  // 使用 send() 方法發(fā)送數(shù)據(jù)
  ws.send('發(fā)送數(shù)據(jù)')
  alert('數(shù)據(jù)發(fā)送中...')
}

// 接收服務端數(shù)據(jù)時觸發(fā)事件
ws.onmessage = function(evt) {
  var received_msg = evt.data
  alert('數(shù)據(jù)已接收...')
}

// 斷開 web socket 連接成功觸發(fā)事件
ws.onclose = function() {
  alert('連接已關閉...')
}

其他特點包括:

  1. 建立在 TCP 協(xié)議之上考杉,服務器端的實現(xiàn)比較容易。

  2. 與 HTTP 協(xié)議有著良好的兼容性舰始。默認端口也是80和443崇棠,并且握手階段采用 HTTP 協(xié)議,因此握手時不容易屏蔽丸卷,能通過各種 HTTP 代理服務器枕稀。

  3. 數(shù)據(jù)格式比較輕量,性能開銷小谜嫉,通信高效萎坷。

  4. 可以發(fā)送文本,也可以發(fā)送二進制數(shù)據(jù)沐兰。

  5. 沒有同源限制哆档,客戶端可以與任意服務器通信。

  6. 協(xié)議標識符是ws(如果加密住闯,則為wss)瓜浸,服務器網址就是 URL。

?著作權歸作者所有,轉載或內容合作請聯(lián)系作者
  • 序言:七十年代末比原,一起剝皮案震驚了整個濱河市插佛,隨后出現(xiàn)的幾起案子,更是在濱河造成了極大的恐慌春寿,老刑警劉巖朗涩,帶你破解...
    沈念sama閱讀 212,185評論 6 493
  • 序言:濱河連續(xù)發(fā)生了三起死亡事件忽孽,死亡現(xiàn)場離奇詭異绑改,居然都是意外死亡,警方通過查閱死者的電腦和手機兄一,發(fā)現(xiàn)死者居然都...
    沈念sama閱讀 90,445評論 3 385
  • 文/潘曉璐 我一進店門厘线,熙熙樓的掌柜王于貴愁眉苦臉地迎上來,“玉大人出革,你說我怎么就攤上這事造壮。” “怎么了骂束?”我有些...
    開封第一講書人閱讀 157,684評論 0 348
  • 文/不壞的土叔 我叫張陵耳璧,是天一觀的道長。 經常有香客問我展箱,道長旨枯,這世上最難降的妖魔是什么? 我笑而不...
    開封第一講書人閱讀 56,564評論 1 284
  • 正文 為了忘掉前任混驰,我火速辦了婚禮屎蜓,結果婚禮上,老公的妹妹穿的比我還像新娘蜀踏。我一直安慰自己蚜迅,他們只是感情好,可當我...
    茶點故事閱讀 65,681評論 6 386
  • 文/花漫 我一把揭開白布廊酣。 她就那樣靜靜地躺著,像睡著了一般。 火紅的嫁衣襯著肌膚如雪辈末。 梳的紋絲不亂的頭發(fā)上,一...
    開封第一講書人閱讀 49,874評論 1 290
  • 那天败潦,我揣著相機與錄音本冲,去河邊找鬼。 笑死劫扒,一個胖子當著我的面吹牛檬洞,可吹牛的內容都是我干的。 我是一名探鬼主播沟饥,決...
    沈念sama閱讀 39,025評論 3 408
  • 文/蒼蘭香墨 我猛地睜開眼添怔,長吁一口氣:“原來是場噩夢啊……” “哼!你這毒婦竟也來了贤旷?” 一聲冷哼從身側響起广料,我...
    開封第一講書人閱讀 37,761評論 0 268
  • 序言:老撾萬榮一對情侶失蹤,失蹤者是張志新(化名)和其女友劉穎幼驶,沒想到半個月后艾杏,有當?shù)厝嗽跇淞掷锇l(fā)現(xiàn)了一具尸體,經...
    沈念sama閱讀 44,217評論 1 303
  • 正文 獨居荒郊野嶺守林人離奇死亡盅藻,尸身上長有42處帶血的膿包…… 初始之章·張勛 以下內容為張勛視角 年9月15日...
    茶點故事閱讀 36,545評論 2 327
  • 正文 我和宋清朗相戀三年购桑,在試婚紗的時候發(fā)現(xiàn)自己被綠了。 大學時的朋友給我發(fā)了我未婚夫和他白月光在一起吃飯的照片氏淑。...
    茶點故事閱讀 38,694評論 1 341
  • 序言:一個原本活蹦亂跳的男人離奇死亡勃蜘,死狀恐怖,靈堂內的尸體忽然破棺而出假残,到底是詐尸還是另有隱情缭贡,我是刑警寧澤,帶...
    沈念sama閱讀 34,351評論 4 332
  • 正文 年R本政府宣布辉懒,位于F島的核電站阳惹,受9級特大地震影響,放射性物質發(fā)生泄漏眶俩。R本人自食惡果不足惜莹汤,卻給世界環(huán)境...
    茶點故事閱讀 39,988評論 3 315
  • 文/蒙蒙 一、第九天 我趴在偏房一處隱蔽的房頂上張望仿便。 院中可真熱鬧体啰,春花似錦攒巍、人聲如沸。這莊子的主人今日做“春日...
    開封第一講書人閱讀 30,778評論 0 21
  • 文/蒼蘭香墨 我抬頭看了看天上的太陽。三九已至沽翔,卻和暖如春兢孝,著一層夾襖步出監(jiān)牢的瞬間,已是汗流浹背仅偎。 一陣腳步聲響...
    開封第一講書人閱讀 32,007評論 1 266
  • 我被黑心中介騙來泰國打工跨蟹, 沒想到剛下飛機就差點兒被人妖公主榨干…… 1. 我叫王不留,地道東北人橘沥。 一個月前我還...
    沈念sama閱讀 46,427評論 2 360
  • 正文 我出身青樓窗轩,卻偏偏與公主長得像,于是被迫代替她去往敵國和親座咆。 傳聞我的和親對象是個殘疾皇子痢艺,可洞房花燭夜當晚...
    茶點故事閱讀 43,580評論 2 349

推薦閱讀更多精彩內容

  • 原文地址:http://www.ibm.com/developerworks/cn/java/j-lo-WebSo...
    敢夢敢當閱讀 8,892評論 0 50
  • WebSocket 機制 WebSocket 是 HTML5 一種新的協(xié)議。它實現(xiàn)了瀏覽器與服務器全雙工通信介陶,能更...
    勇敢的_心_閱讀 2,251評論 0 4
  • WebSocket簡介 談到Web實時推送堤舒,就不得不說WebSocket。在WebSocket出現(xiàn)之前哺呜,很多網站為...
    吧啦啦小湯圓閱讀 8,129評論 15 75
  • Web 頁面的實現(xiàn) Web 基于 HTTP 協(xié)議通信 客戶端(Client)的 Web 瀏覽器從 Web 服務器端...
    毛圈閱讀 1,077評論 0 2
  • 很多場景下的應用對數(shù)據(jù)實時更新要求很高舌缤。比如股票交易,數(shù)字資產交易某残,還有一些需要動態(tài)更新數(shù)據(jù)的大屏數(shù)據(jù)可視化應用等...
    前端進階體驗閱讀 1,288評論 0 4