10分鍾學會web通訊的四種方式,短輪詢、長輪詢(comet)、長連接(SSE)、WebSocket


一般看到標題我們一般會產生下面幾個問題???

  1. 什么是短輪詢?
  2. 什么是長輪詢?
  3. 長連接又是什么?
  4. wensocket怎么實現呢?
  5. 他們都能實現web通訊,區別在哪呢,哪個好用呢?

接下來我們就一個個來了解下,在這之前我們先看看http協議是什么??

一、http協議介紹

http 協議是請求/響應范式的, 每一個 http 響應都是由一個對應的 http 請求產生的; http 協議是無狀態的,多個 http 請求之間是沒有關系的.

 

二、http 短輪詢:

 

http端輪詢是服務器收到請求不管是否有數據都直接響應 http 請求; 瀏覽器受到 http 響應隔一段時間在發送同樣的http 請求查詢是否有數據;

 

http 短輪詢的局限是實時性低;

 

兩者相同點:
可以看出 http 長輪詢和 http 短輪詢的都會 hold 一段時間;

 

兩者不同點
間隔發生在服務端還是瀏覽器端: http 長輪詢在服務端會 hold 一段時間, http 短輪詢在瀏覽器端 “hold”一段時間;

三、http 長輪詢:

http 長輪詢是服務器收到請求后如果有數據, 立刻響應請求; 如果沒有數據就會 hold 一段時間,這段時間內如果有數據立刻響應請求; 如果時間到了還沒有數據, 則響應 http 請求;瀏覽器受到 http 響應后立在發送一個同樣http 請求查詢是否有數據;

http 長輪詢的局限:

  1. 瀏覽器端對統一服務器同時 http 連接有最大限制, 最好同一用戶只存在一個長輪詢;
  2. 服務器端沒有數據 hold 住連接時會造成浪費, 容易產生服務器瓶頸;

 

四、http 長連接:

目前 http 協議普遍使用的是 1.1 版本, 之前有個 1.0 版本,兩者之間的一個區別是 1.1 支持 http 長連接, 或者叫持久連接.1.0 不支持 http 長連接, 每次一個 http請求響應后都關閉 tcp 連接, 下個 http 請求會重新建立 tcp 連接.

所謂 http 長連接, 就是多個 http 請求共用一個 tcp 連接; 這樣可以減少多次臨近 http 請求導致 tcp建立關閉所產生的時間消耗. http 1.1 中在請求頭和相應頭中用 connection字段標識是否是 http長連接, connection: keep-alive, 表明是 http 長連接; connection:closed, 表明服務器關閉 tcp 連接

與 connection 對應的一個字段是 keep-live, http 響應頭中出現, 他的格式是 timeout=30,max=5, timeout 是兩次 http 請求保持的時間(s), , max 是這個 tcp 連接最多為幾個 http請求重用

 

 五、webSocket:

WebSocket的實現了一次連接,雙方通信的功能。首先由客戶端發出WebSocket請求,服務器端進行響應,實現類似TCP握手的動作。這個連接一旦建立起來,就保持在客戶端和服務器之間,兩者之間可以直接的進行數據的互相傳送。服務器端的邏輯比較復雜,如果是java或者node開發,都有很多封裝好的組件可以使用。

案例:①、創建webSocket對象

var ws = new WebSocket(“ws//localhost:8080”);

  WebSocket是一個不同於HTTP的協議,其參數傳遞中的ws://前綴類似於http://,用於進行協議的聲明。

②、事件操作

WebSocket提供了四個事件操作,如下:

onmessage收到服務器響應時執行

onerroe 出現異常時執行

onopen 建立起連接時執行

onclose 斷開連接時執行

 

六、優缺點

輪詢:客戶端定時向服務器發送Ajax請求,服務器接到請求后馬上返回響應信息並關閉連接。 
優點:后端程序編寫比較容易。 
缺點:請求中有大半是無用,浪費帶寬和服務器資源。 
實例:適於小型應用。


長輪詢:客戶端向服務器發送Ajax請求,服務器接到請求后hold住連接,直到有新消息才返回響應信息並關閉連接,客戶端處理完響應信息后再向服務器發送新的請求。 
優點:在無消息的情況下不會頻繁的請求,耗費資源小。 
缺點:服務器hold連接會消耗資源,返回數據順序無保證,難於管理維護。 
實例:WebQQ、Hi網頁版、Facebook IM。

 

長連接:在頁面里嵌入一個隱蔵iframe,將這個隱蔵iframe的src屬性設為對一個長連接的請求或是采用xhr請求,服務器端就能源源不斷地往客戶端輸入數據。 
優點:消息即時到達,不發無用請求;管理起來也相對方便。 
缺點:服務器維護一個長連接會增加開銷。 
實例:Gmail聊天


Flash Socket:在頁面中內嵌入一個使用了Socket類的 Flash 程序JavaScript通過調用此Flash程序提供的Socket接口與服務器端的Socket接口進行通信,JavaScript在收到服務器端傳送的信息后控制頁面的顯示。 
優點:實現真正的即時通信,而不是偽即時。 
缺點:客戶端必須安裝Flash插件;非HTTP協議,無法自動穿越防火牆。 
實例:網絡互動游戲。

七、應用:

長輪詢一般用在 web im, im 實時性要求高, http 長輪詢的控制權一直在服務器端, 而數據是在服務器端的,因此實時性高;
像新浪微薄的im, 朋友網的 im 以及 webQQ 都是用 http 長輪詢實現的;
NodeJS 的異步機制貌似可以很好的處理 http 長輪詢導致的服務器瓶頸問題, 這個有待研究.

http 短輪詢一般用在實時性要求不高的地方, 比如新浪微薄的未讀條數查詢就是瀏覽器端每隔一段時間查詢的.

其他:

關於 http 長連接一個誤解就是服務器主動推送數據, 這個在 http 協議下是無法實現的, 因為 http請求/響應范式決定的, http 中服務器返回數據必須要有一個瀏覽器端的請求對應,服務器無法主動推送給瀏覽器數據.
不管 http 長輪詢還是 http 短輪詢 保證同一個用戶在多 tab 下只存在一個定時查詢是有好處的,這可以通過在瀏覽器端緩存數據解決, 在 http 響應后在瀏覽器端緩存數據, 並設置一個有效期,然后在每次發送 http 請求時檢查是否有有效數據, 沒有則發送請求獲取

這是我所學習的東西,當然這只是總結啦,寫得不好別見怪,寫錯了麻煩指正謝謝

參考文章:https://www.cnblogs.com/AloneSword/p/3517463.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM