2009-10-16 97 views
7

我寫了一個小型的Web應用程序,它基本上是瀏覽器中的JQuery支持的聊天客戶端,用於通過AJAX請求輪詢服務器,然後附加任何新的回覆我擔心儘可能提高效率,同時不會失去實時感受。Ajax聊天輪詢帶寬效率

http://darklightweb.co.uk/RealTime/

我看不到任何方式中斷是可能的,所以我投票頁面每5秒,如果沒有新的職位都可以保持數據傳輸下來,如果它的閒置,如果不返回任何內容確實有消息發出隊列中的頂級消息,並且一旦Ajax請求完成,我就再次檢查,直到消息隊列爲空。

有關使其儘可能低帶寬或可能的替代實現的任何其他技巧?

回答

11

輪詢可能不是實現聊天的最佳解決方案 - 我建議看看COMETJQuery's implementation,它保持與客戶端的開放連接並將服務器的「更新」推下來,同時也是quite scalable

+0

非常好,謝謝你。 – Baxter 2009-10-16 11:28:00

+4

有沒有人知道如果堆棧溢出使用輪詢來找出更新,如「添加2個新答案 - 點擊這裏顯示他們」,而你輸入自己的答案?還是它使用某種類似「彗星」的「推動」系統? – 2010-11-09 18:53:16

4

我覺得對於一個聊天應用程序,你可以使用

Reverse Ajax

反向阿賈克斯是指使用長壽命HTTP 連接以實現之間的低延遲 通信一個Ajax設計 模式web服務器和 的瀏覽器。基本上它是 從客戶端向服務器發送數據的一種方式,並且 是用於將服務器數據 推回到瀏覽器的機制。 1

這種服務器 - 客戶端通信採取兩種形式 一個:

* Client polling, the client repetitively queries (polls) the 

服務器,並等待答覆。 *服務器推送時,服務器和客戶端之間的連接保持打開,服務器在 可用時發送數據。

反向Ajax描述了這些 模型中的任意一個的執行 ,或兩者的組合。 設計模式也被稱爲Ajax Push,Full Duplex Ajax和Streaming Ajax。

moo-comet

Request.Comet是一個簡單的JavaScript類來創建跨瀏覽器彗星(反向Ajax)應用程序容易。它提供客戶端和服務器之間的實時數據傳輸,並且可以與任何服務器端語言一起使用。

+0

還有一個針對JQuery的反向ajax(Comet)實現,所以使用moo-comet可能不如Baxter使用JQuery那麼方便(請參閱我的答案中的鏈接) – msparer 2009-10-16 11:24:57

+0

謝謝,很好的回答,但我更喜歡堅持一個JS框架。 – Baxter 2009-10-16 11:27:19

1

我已經寫了幾乎完全相同的應用程序,以方便在各種僱主使用draconian網頁過濾時在工作中的朋友之間的溝通。

我發現這些輪詢請求傳輸的數據量很少,很少接近每個登錄用戶1kb/s,通常少得多,因爲您只是輪詢5秒。

帶寬真的是問題還是你過早優化?

+0

「你是否過早地優化?」 該死的。 – Baxter 2009-10-16 11:25:28

1

如果決定不再繼續與COMET方法,那麼我會和你一樣做,除非隊列包含多條消息,那麼它們一次全部發送。這樣你只能每隔5秒查詢一次,不要再查看(也不能少於)。當然,如果連接100個人,這仍然會導致每秒20個請求,所以您應該嘗試優化服務器端,以便每個請求儘可能少地佔用服務器資源(CPU/RAM /時間)。緩存是你的朋友在這裏。

我不會擔心帶寬,因爲聊天消息通常非常短,您的請求無論如何都很小。