javascript - test - websocket opcode




在什麼情況下,AJAX長/短輪詢比HTML5 WebSockets更受歡迎? (2)

我正在為朋友構建一個小型聊天應用程序,但不確定如何及時獲取信息,這不像手動或基本不如刷新頁面那樣簡單。

目前,我正在使用簡單的AJAX來實現這個功能,但是這有一個缺點,就是當一個短暫的計時器過去時,會定期點擊服務器。

在研究長/短輪詢時,我碰到了HTML5 WebSockets。 這似乎很容易實現,但我不確定是否存在一些隱藏的缺點。 例如,我認為WebSockets只支持某些瀏覽器。 我應該知道WebSocket還有其他的缺點嗎?

既然看起來這兩種技術都是一樣的,那麼在哪種情況下,人們會喜歡使用哪一種呢? 更具體地說,HTML5 WebSockets是否使AJAX長/短輪詢過時,或者有更好的理由選擇AJAX而不是WebSockets?


WebSockets絕對是未來。

長時間輪詢是一種骯髒的解決方法,以防止像AJAX那樣為每個請求創建連接 - 但是當WebSocket不存在時創建了長輪詢。 現在由於WebSockets,長時間輪詢正在消失。

WebRTC允許點對點通信。

我建議學習WebSockets

比較:

網絡上不同的通信技術

  • AJAX - requestresponse 。 創建與服務器的連接,發送包含可選數據的請求標頭,從服務器獲取響應並關閉連接。 在所有主流瀏覽器均支持。

  • 長時間輪詢 - requestwaitresponse 。 像AJAX一樣創建一個到服務器的連接,但是保持一段時間保持連接狀態(不久)。 在連接期間,開放客戶端可以從服務器接收數據。 由於超時或數據超時,客戶端必須在連接關閉後定期重新連接。 在服務器端,它仍然像HTTP請求一樣被處理,與AJAX相同,除了應用程序邏輯定義的請求應答現在或將來會發生。 支持圖表(全部) | wikipedia

  • WebSockets - clientserver 。 創建到服務器的TCP連接,並根據需要保持打開狀態。 服務器或客戶端可以輕鬆關閉連接。 客戶端通過HTTP兼容的握手過程。 如果成功,則服務器和客戶端可以隨時雙向交換數據。 如果應用程序需要兩種方式進行頻繁的數據交換,則效率很高。 WebSocket確實具有數據成幀功能,其中包括屏蔽從客戶端發送到服務器的每條消息,因此數據只是被加密。 WebSockets | wikipedia

  • WebRTC - peer↔peer。 傳輸建立客戶端之間的通信,並且與傳輸無關,所以它可以使用UDP,TCP或更多抽象層。 這通常用於高容量數據傳輸,例如視頻/音頻流傳輸,其中可靠性是次要的,可以犧牲少數幾幀或降低質量進程,從而有利於響應時間和至少一些數據傳輸。 雙方(同伴)可以獨立推送數據。 雖然它可以完全獨立於任何集中式服務器,但仍需要某種方式交換endPoints數據,在大多數情況下,開發人員仍然使用集中式服務器來“鏈接”對等方。 這只需要交換建立連接的基本數據,之後不需要中央服務器。 支持圖表(中) | wikipedia

  • 服務器發送的事件 - clientserver 。 客戶端建立與服務器的持久和長期連接。 只有服務器可以將數據發送到客戶端。 如果客戶想要將數據發送到服務器,則需要使用其他技術/協議才能這樣做。 該協議與HTTP兼容,並且易於在大多數服務器端平台中實現。 這是一個較好的協議,用來代替長輪詢。 支持圖表(好,除了IE) | wikipedia

優點:

WebSocket服務器端的主要優勢在於它不是HTTP請求(握手之後),而是一個適當的基於消息的通信協議。 這使您可以實現巨大的性能和體系結構優勢 。 例如,在node.js中,您可以為不同的套接字連接共享相同的內存,因此它們都可以訪問共享變量。 因此,您不需要在中間使用數據庫作為交換點(如使用AJAX或使用PHP等語言進行長輪詢)。 您可以將數據存儲在RAM中,甚至可以立即在套接字之間重新發布。

安全考慮

人們經常關心WebSocket的安全性。 現實情況是,它幾乎沒有什麼區別,甚至把WebSocket作為更好的選擇。 首先,使用AJAX, MITM機會更大,因為每個請求都是通過互聯網基礎結構遍歷的新TCP連接。 使用WebSockets時,一旦連接起來,在兩者之間進行截取就顯得更具挑戰性,而當數據從客戶端傳輸到服務器時需要額外實施幀掩碼以及額外的壓縮,這需要更多的努力來探測數據。 所有現代協議都支持:HTTP和HTTPS(加密)。

PS

請記住,WebSockets通常有一個非常不同的網絡邏輯 ,更像實時遊戲,而不是像http。


對於聊天應用程序或任何其他與服務器進行持續對話的應用程序, WebSockets是最佳選擇。 但是,您只能將WebSockets與支持它們的服務器一起使用,因此如果無法安裝所需的庫,則可能會限制您使用它們的能力。 在這種情況下,您需要使用Long Polling來獲得類似的功能。





network-protocols