2016-11-13 45 views
3

這個問題是這個問題真的很相似:What is the difference between web sockets, long polling, server-sent events and forever frame?Forever-frame和服務器發送的事件有什麼區別?

然而,這個問題的答案並沒有提到SSE和永遠幀之間的差異。
讓我給你簡單的解釋一下。

關於SSE,系統真的很像Comet,但與Comet不同的一點是數據發送後沒有斷開連接。 因此,從服務器到客戶端的連接是長期存在的,客戶端接收整個數據的一系列片段。

另一方面,永遠的框架似乎與我非常相似。在Forever框架中,首先客戶端收到包含iframe標籤的頁面,在隱藏的iframe內建立一個長期連接。然後客戶端接收來自服務器的分塊數據,並在客戶端已有的第一個文檔中使用一些功能來操作DOM。

我假設區別是Forever-frame在機制中使用iframe標記,但SSE不能和SSE可以通過更多方式實現。 我對不對?

回答

2

以前我沒有聽說過這個名字的Forever-frame! (本書的第7章是關於HTML5 SSE的數據推送應用,位於「iframe」部分)。

長輪詢:提出請求(使用XMLHttpRequest的,即阿賈克斯),保持打開狀態,直到數據準備在服務器上。然後套接字關閉。重新連接以獲取下一個數據位。

XHR輪詢:發出請求(使用XMLHttpRequest2,即ajax),但偵聽readyState == 3信號。後端服務器必須知道保持連接打開,並且客戶端必須知道要聽readyState == 3。 (不在IE9和更早,因爲該瀏覽器從來沒有提供readyState的== 3級的消息,但去直接的readyState == 4)

的iframe:打開一個隱藏的iframe到後端進程。定期查看iframe的源代碼,看看有沒有新的東西。 (技術上講,它適用於所有的瀏覽器,但IE8和IE9是唯一的,帶有足夠的低延遲的更新是有用的我(2013年)的測試。)

SSE:的HTML5標準,大致如下XHR輪詢(Firefox和Chrome,至少,直接在XMLHttpRequest2之上實現它),但是隱藏了複雜的細節。如果套接字關閉,它還會添加自動重新連接,以及其他一些高級功能。

在上述書的第7章末尾,我展示了讓所有技術在任何瀏覽器中工作的代碼。優先順序爲:

  • SSE(如果可用)
  • 其他XHR(如果可用)
  • 其他的iframe,如果IE8或IE9
  • 其他longpoll

還有另一個區別:XHR並且iframe技術將整個消息歷史存儲在內存中。因此,如果您打算長時間保持套接字打開狀態和/或發送大量大消息,這可能會導致內存問題,而SSE不會發生這種情況。

內容提要:不要擔心「永遠的畫面」,除非你有足夠的客戶仍在使用IE8/IE9的longpoll辦法將建立在你的基礎設施顯着額外的負載。

+0

感謝您對這些技術的概述。但是,在某些方面仍然不明確。 1:我不確定長輪詢和XHR輪詢之間的區別。我搜索了「XHR輪詢」一詞,但我找不到任何有關它的好消息。正如您所提到的,不同之處在於,長輪詢使用XMLHttpRequest1,其中XML輪詢執行XMLHttpRequest2嗎? 2:在XHR輪詢時,哪一方是從readyState發出的信號?從服務器端?還是客戶? 3:你是什麼意思的「自動重新連接」?這意味着服務器發送數據後,連接是否中斷一次? –

+0

@KazuyaTomita是不是太厚臉皮建議買我的書 - 有足夠的空間來覆蓋這些主題徹底:-) 正常長輪詢和之間有什麼區別,我稱之爲「XHR」被前者只是使用的readyState == 4,而後者使用readyState == 3。 readyState是客戶端JavaScript XMLHttpRequest2 API的一部分。 –

+0

因此,您對關於答案的長輪詢和XHR輪詢的解釋的陳述是錯誤的,因爲兩者都根據您的其他評論使用XMLHttpRequest2?如果沒關係,請給我任何關於question3的簡要解釋。 –

相關問題