2013-04-07 70 views
3

我正在用JavaScript,jQuery,MySQL和PHP構建聊天應用程序,我只是想知道客戶端從服務器檢索聊天消息的最佳方式是什麼?我目前潛在的候選人是輪詢,長輪詢,HTML5服務器發送的事件(EventSource)和WebSockets。其中哪些是最快的(即時消息)和最有效的方法(如果可能的話解釋爲什麼)?或者如果有更好的方法來做到這一點,請在答案中詳細說明。客戶端從服務器檢索聊天消息的最佳方式?

此外,我還查看了Node.js + Socket.IO,但是我發現的文檔和代碼示例並沒有讓我覺得有點意思。

最後,我使用XAMPP作爲本地服務器和MySQL作爲我的數據庫用於此應用程序。

任何幫助,將不勝感激。

+0

IRC是要走的路。 – hakre 2013-04-08 00:06:14

+0

@hakre恐怕我無法理解IRC的意思。快速搜索它會告訴我它是「互聯網中繼聊天」,但我無法得到任何進一步的。我似乎無法找到任何關於此技術/協議的文檔/無論它是什麼。你能否通過鏈接指向正確的方向? – 2013-04-08 00:20:53

+0

@kpsuperplane:IRC確實是互聯網中繼聊天。這是一個協議。當然有[維基百科文章](https://en.wikipedia.org/wiki/Internet_Relay_Chat)。對於技術細節,有[RFC](https://tools.ietf.org/html/rfc1459)。有各種各樣的實現;沒有指定的「官方」。你必須看看你的選擇是什麼,就像你可能會看到不同的Web或郵件服務器一樣。 – icktoofay 2013-04-08 00:27:45

回答

4

巧合的是,您列出的選項按效率排列,從最低到最高。

輪詢效率最低。它將輪詢是否有消息,並在其他客戶端發送和接收的消息之間引入延遲。

長查詢更好;那麼您可以在發送消息時收到消息,但重新連接可能會稍微延遲。在這段延遲期間,郵件將不會被傳送,但除此之外,它幾乎是瞬間的。

COMET(未提及)比長輪詢更好,但比Server-Sent Events更糟。由於大多數Web服務器和瀏覽器都有超時連接,所以它也必須偶爾重新連接,但無論何時發送消息都不需要重新建立連接。像長時間輪詢一樣,重新連接可能會有延遲,但除此之外,通常是瞬時的。

服務器發送的事件與COMET類似,但是當它不被刷新時,它具有來自瀏覽器的本地支持,所以它可以繞過超時限制並且只需要在其整個生命週期內建立一個連接(只要連接不是壞了)。另一個優點是,如果連接斷開而不需要客戶端代碼,它會自動重新連接。這是即時的。

WebSockets是迄今爲止所有這些選項中最好的;它只需要一個連接,而且它是雙工的:不僅可以通過它接收消息,而且還可以通過它發送消息,而不是在每次發送消息時都需要分別連接到服務器。與服務器發送的事件不同,它需要更多的代碼:如果連接中斷,服務器端實現通常更復雜,它不會自動重新連接。我也不確定你是否可以在Apache/XAMPP中使用它。這是即時的。 (幾乎?)所有這些和一些(例如,Flash套接字)並將它抽象爲一個漂亮的API後面的庫,所以你不必處理瀏覽器支持的特性爲他們每個人。它與它選擇使用的傳輸速度一樣快,這取決於它運行的瀏覽器。它也可以減少你必須編寫的代碼量。但是,如果它對你來說太複雜,而且你不關心舊版瀏覽器,那肯定沒有必要。另外,它真的很喜歡自己運行。您可能可以讓XAMPP代理它,但是我不知道Apache 是否可以配置以將WebSocket轉發給它。

+0

謝謝您的詳細解答,我的問題的70%被回答。另外30%是速度(即時 - 延遲/超時)方面的簡單選項列表,如果可能則進行說明。如果你可以添加,我將它標記爲答案。 – 2013-04-08 00:18:30

+0

謝謝修改後的答案 - 看起來我正在和SSE一起去。 – 2013-04-08 00:46:48

相關問題