websocke前世今生

來源:互聯網
上載者:User

標籤:網路通訊協定   應該   運行   nop   tcp   web應用   .com   方式   connect   

註:以下內容來自網上。本人經過加工整理。

1、問什麼要用websocke?

Browser已經支援http協議,為什麼還要開發一種新的WebSocket協議呢?我們知道http協議是一種單向的網路通訊協定。在建立串連後,它僅僅同意Browser/UA(UserAgent)向WebServer發出請求資源後。WebServer才幹返回對應的資料。而WebServer不能主動的推送資料給Browser/UA,當初這麼設計http協議也是有原因的。如果WebServer能主動的推送資料給Browser/UA,那Browser/UA就太easy受到攻擊,一些廣告商也會主動的把一些廣告資訊在不經意間強行的傳輸給client,這不能不說是一個災難。那麼單向的http協議給如今的網站或Web應用程式開發帶來了哪些問題呢?

在http協議上要實現browser擷取server端即時資料的需求(比如:股票即時交易)。往往使用下面兩種方案:

1)polling

這樣的方式就是通過Browser/UA定時的向Webserver發送http的Get請求,server收到請求後,就把最新的資料發回給client(Browser/UA),Browser/UA得到資料後。就將其顯示出來,然後再週期性反覆這一過程。儘管這樣能夠滿足需求。可是也仍然存在一些問題,比如在某段時間內Webserver端沒有更新的資料,可是Browser/UA仍然須要定時的發送Get請求過來詢問。那麼Webserver就把曾經的老資料再傳送過來。Browser/UA把這些沒有變化的資料再顯示出來,這樣顯然既浪費了網路頻寬,又浪費了CPU的利用率。假設說把Browser發送Get請求的周期調大一些。就能夠緩解這一問題,可是假設在Webserver端的資料更新非常快時,這樣又不能保證Web應用程式擷取資料的即時性。

2)long polling

它是對Polling的一種改進。

Browser/UA發送Get請求到Webserver,這時Webserver能夠做兩件事情,第一,假設server端有新的資料須要傳送,就馬上把資料發回給Browser/UA,Browser/UA收到資料後。馬上再發送Get請求給Web Server。第二,假設server端沒有新的資料須要發送。這裡與Polling方法不同的是,server不是馬上發送回應給Browser/UA。而是把這個請求保持住,等待有新的資料到來時,再來響應這個請求。當然了。假設server的資料長期沒有更新,一段時間後。這個Get請求就會逾時,Browser/UA收到逾時訊息後。再馬上發送一個新的Get請求給server。然後依次迴圈這個過程。

這種方式儘管在某種程度上減小了網路頻寬和CPU利用率等問題。可是仍然存在缺陷,比如如果server端的資料更新速率較快。server在傳送一個資料包給Browser後必須等待Browser的下一個Get請求到來,才幹傳遞第二個更新的資料包給Browser,那麼這種話,Browser顯示即時資料最快的時間為2×RTT(往返時間),另外在網路擁塞的情況下,這個應該是不能讓使用者接受的。

另外,因為http資料包的頭部資料量往往非常大(通常有400多個位元組),可是真正被server須要的資料卻非常少(有時僅僅有10個位元組左右),這種資料包在網路上周期性的傳輸,難免對網路頻寬是一種浪費。

2、webSocket協議簡單介紹

WebSocket協議是一種 雙向通訊協定。它建立在TCP之上,同http一樣通過TCP來資料轉送。可是它和http最大的不同有兩點:

1.WebSocket是一種雙向通訊協定,在建立串連後,WebSocketserver和Browser/UA都能主動的向對方發送或接收資料,就像Socket一樣。不同的是WebSocket是一種建立在Web基礎上的一種簡單類比Socket的協議。

2.WebSocket須要通過握手串連。類似於TCP它也須要client和server端進行握手串連,串連成功後才幹相互連信。


這裡簡單說明一下WebSocket握手的過程:

當Web應用程式調用new WebSocket(url)介面時,Browser就開始了與地址為url的WebServer建立握手串連的過程。

1.    Browser與WebSocketserver通過TCP三向交握建立串連,假設這個建立串連失敗,那麼後面的過程就不會運行。Web應用程式將收到錯誤訊息通知。

2.     在TCP建立串連成功後,Browser/UA通過http協議傳送WebSocket支援的版本。協議的字版本,原始地址,主機地址等等一些欄欄位給server端。

<span style="font-family:Comic Sans MS;">GET /chat HTTP/1.1  Host: server.example.com  Upgrade: websocket  Connection: Upgrade  Sec-WebSocket-Key:dGhlIHNhbXBsZSBub25jZQ==  Origin: http://example.com  Sec-WebSocket-Protocol: chat,superchat  Sec-WebSocket-Version: 13  </span>
3.     WebSocketserver收到Browser/UA發送來的握手請求後,假設資料包資料和格式正確,client和server端的協議版本匹配等等,就接受本次握手串連,並給出對應的資料回複。相同回複的資料包也是採用http協議傳輸。

<span style="font-family:Comic Sans MS;">HTTP/1.1 101 Switching Protocols  Upgrade: websocket  Connection: Upgrade  Sec-WebSocket-Accept:s3pPLMBiTxaQ9kYGzzhZRbK+xOo=  Sec-WebSocket-Protocol: chat  </span>
4.     Browser收到server回複的資料包後。假設資料包內容、格式都沒有問題的話,就表示本次串連成功,觸發onopen訊息,此時Web開發人員就能夠在此時通過send介面想server發送資料。否則,握手串連失敗,Web應用程式會收到onerror訊息,而且能知道串連失敗的原因。

3、websocke和http關係:

WebSocket與http協議一樣都是基於TCP的,所以他們都是可靠的協議,Web開發人員調用的WebSocket的send函數在browser的實現中終雩都是通過TCP的系統介面進行傳輸的。

WebSocket和Http協議一樣都屬於應用程式層的協議,那麼他們之間有沒有什麼關係呢?答案是肯定的,WebSocket在建立握手串連時。資料是通過http協議傳輸的。正如我們上一節所示“GET/chat HTTP/1.1”,這裡面用到的僅僅是http協議一些簡單的欄位。可是在建立串連之後,真正的傳輸資料階段是不須要http協議參與的。

watermark/2/text/aHR0cDovL2Jsb2cuY3Nkbi5uZXQv/font/5a6L5L2T/fontsize/400/fill/I0JBQkFCMA==/dissolve/70/gravity/Center" >


4、websocke瀏覽器端的api:

<span style="font-family:Comic Sans MS;">var wsServer = 'ws://localhost:8888/Demo'; //server地址,這裡是ws開頭。假設是安全websocke使用wssvar websocket = new WebSocket(wsServer); //建立WebSocket對象  websocket.send("hello");//向server發送訊息  alert(websocket.readyState);//查看websocket目前狀態  websocket.onopen = function (evt) {  //已經建立串連  };  websocket.onclose = function (evt) {  //已經關閉串連  };  websocket.onmessage = function (evt) {  //收到server訊息,使用evt.data提取  };  websocket.onerror = function (evt) {  //產生異常  };  </span>

5、wbsocke服務端api說明:

由於WebSocket是一種通訊協議,須要在client(瀏覽器已經幫我們實現)和server端都實現該協議才幹完畢WebSocket的通訊。所以server端須要藉助一些lib包實現。

tomcat7中websocket的訊息格式:


詳細能夠參照tomcat7下對websocket的支援返利:http://www.aiuxian.com/article/p-228470.html

websocke前世今生

相關文章

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.