2011-10-14 38 views

回答

1

允許普通TCP連接的API並不是通用的JavaScript(這些將是WebSocket API)。有些瀏覽器還沒有。當你說長時間輪詢你可能意味着用來模仿TCP over HTTP的技術(這是一種荒謬的:))。這是一個HTTP請求,需要花費大量時間來發送,但是會以大塊的形式發送。這種技術相當於濫用HTTP,但是仍然很流行,因爲我們在Web開發方面的選擇有限。

當然,您可以使用任何其他瀏覽器插件或任何其他獨立的應用程序來實現聊天程序的TCP。

你當然可以設計一個通過HTTP工作的聊天程序,但由於HTTP的無狀態性質,它會使任務像會話維護一樣變得更加困難和低效(正如你需要發送會話信息一樣,每次請求再次)。

最後,一些流行的IM格式(例如Jabber)需要TCP連接。 Jabber還要求Base64對內容進行編碼(然而,愚蠢的是,這是很多人使用的格式),並使用一些加密算法進行身份驗證。使用二進制數據處理Flash時,Flash更快,因此在那裏實現加密算法更容易。

4

性能,因爲Flash爲開發者提供了Sockets。使用套接字,您可以打開連接並保持打開狀態,直到客戶端離開應用程序。當服務器中有新的信息時,它將數據寫入通信通道,客戶端自動讀取數據。沒有拉,沒有連接開銷,沒有額外的數據需要(例如HTTP協議頭)。

網絡延遲帶寬將限制您的服務器可以發送的數據量。它也會限制你的客戶可以讀取的數據量。關於服務器的資源量(通常RAM內存)限制的活動連接數(同時打開)你被允許保留。

當HTTP是用於聊天(或其他長輪詢)的應用程序,通信是無狀態的,這意味着應用程序必須打開與每一個有交換數據的時間服務器的新連接。您可以使用persistent connection(保持活動)重用現有的連接,但根據超時,它會傷害服務器性能:

  • 高超時值:使用一個連接更多的數據交換,但它將捆綁多個服務器進程或線程的時間太長。服務器將同時支持更少的用戶。

  • 低超時值:服務器進程被釋放很快,因爲他們放下你的連接更早時,另一個請求,但是如果超時太低,你最終會不會重用的連接,這將導致一個新的連接每你必須交換數據。很壞。

此外,HTTP協議並未設計用於實時通信。它需要基於文本的頭文件,這會在通信時浪費大量的字節。我寫了一個article比較了Smartfox服務器的不同通信協議,我注意到在基於文本的協議(XML,JSON)中,頭部(和補充)表示我的情況下消息大小爲50-75%;即使消息「純」數據非常小(28字節),它也給出了頭部開銷的概念。

如果您在整個通信時間內保持通道打開並以二進制形式交換數據,您可以避免連接開銷,並可以調整消息以實現高吞吐量。

通知:今天,您可以使用WebSockets來實現僅在過去使用Flash通信才能實現的結果。例如,Socket.io可以在每個使用javascript的瀏覽器上實現實時連接;它使用WebSockets(如果可用)或Flash或AJAX或瀏覽器支持的其他技術進行通信。

+0

我打算爲賞金寫下自己的答案,但你已經覆蓋了Dovyski!我想澄清一下,你對資源需求的假設取決於服務器軟件的具體實現。例如,[WebSync](http://www.frozenmountain.com/websync/)通過良好的服務器編程減輕資源需求,以降低所需的線程數量和內存量。在當今瀏覽器和設備的世界中,爲了兼容性,您需要一個具有多種蒸發方法的抽象層。你的第一段和最後一段與這個問題最相關。 – BenSwayne

+0

謝謝,BenSwayne!我完全同意你對我的資源假設(這是非常天真的)。我只是想對基於HTTP的長輪詢應用程序中的資源/性能之間的關係給出一個簡單明瞭的概念。 –