2013-05-26 156 views
0

我想實現一個實時消息的功能,例如在臉書上聊天,但有幾個問題讓我困惑:
1.爲了減少服務器的開銷並使其成爲真正的「實時」,我應該使用全雙工像socket這樣的通信而不是Ajax,是嗎?
2.如果我使用套接字,我應該選擇哪種協議,TCP或UDP?
3.假設我正在使用TCP,服務器是否會繼續嘗試重新發送丟失的包,這樣會花費很多開銷?
4.如果網絡在服務器和客戶端之間的通信中失敗會怎麼樣?套接字是否會自行關閉,或者我應該處理幾種網絡條件?
任何人都可以幫忙嗎?服務器推送或客戶端請求? TCP還是UDP?

+1

我建議你嘗試TCP並找出答案。你可能試圖解決那些對你來說不成問題的問題。 :) –

+0

我只是不知道如何處理不同的網絡條件。感謝您的建議,我會盡力。 :) – dastan

+0

幾乎所有錯誤都會導致IOException。如果您嘗試從連接讀取(),您將能夠檢測到連接已關閉。 –

回答

0
  1. 您可以使用WebSockets。 XMLHttpRequest的,現在可能是過時的東西實時(因爲它不是實時的),雖然你可能回落到使用它誰使用瀏覽器的人不支持WebSockets的

    • 使用UDP,如果您發送的信息僅在發送時間內有效,例如在作爲玩家位置的遊戲中(您不希望在5秒前收到他們的位置)。此外,你不能使用UDP與WebSockets

    • 對於其他任何東西,使用TCP(除非你打洞來實現P2P),因爲數據丟失可能對你不利,TCP處理它。

  2. 你將不得不檢查反正手動重新發送UDP數據丟失,除非通信失敗是可以接受的,你

  3. ,你會得到一個IOException。如果連接沒有正確關閉,那麼在您可以根據您的需要更改無響應超時之後,將拋出異常。假設您使用TCP,否則當您根據您收到的響應/數據(或未收到)考慮客戶端連接或斷開連接時,應該自己想清楚。

+0

這對你的解釋非常有用。但是,TCP仍然會繼續嘗試重新發送數據包,因爲客戶端沒有響應?另一個問題是,如果在傳輸圖像時使用UDP,在傳輸過程中某些數據包丟失時,是否可以在客戶端顯示圖像(不是很準確)? – dastan

+0

如果您對此級別的TCP感興趣,那麼您應該閱讀[RFC 793 - 傳輸控制協議](http://www.ietf.org/rfc/rfc793.txt) –

+0

好的,謝謝! :) – dastan

-1

我建議http://cometd.org/你應該看到示例&消息傳遞邏輯。

+0

這是一個基於C/S的項目,所以我擔心Comet不適合。另外,我認爲Ajax模式會增加服務器的壓力。 – dastan