2012-02-04 42 views
2

我最近正在編寫一個UDP服務器,用於我在C#和XNA上爲PC製作的2D射擊遊戲,它將在需要時更新併發送世界數據,實體數據,聊天數據等。C#如何確保所需的UDP數據到達客戶端/服務器?

當我爲玩家創造一種改變武器的方式時,最近一個問題突然浮現在腦海中:如果數據包發送到服務器請求更換武器,會發生什麼情況?這個問題讓我想到另一個問題;如何讓客戶端和服務器確認接收某些數據包或數據塊?

所以,我想出了下面這個簡單的尋找解決方案來解決這個問題:

  1. 服務器發送數據包(S)需要進行確認。
  2. 客戶端收到數據包併發送確認數據包。
  3. 服務器檢查客戶端是否確認數據。如果客戶沒有,重新發送數據。

建議的解決方案看起來不錯,但如果在確認數據包丟失或意外發生任何事情的情況下會發生什麼?

更好的解決方案是創建一個使用TCP和UDP的服務器和客戶端;哪裏需要使用TCP來獲取數據,並按順序/一次到達數據,使用UDP來獲取需要快速到達並能夠應對丟失或錯誤的數據?

如果一個TCP/UDP服務器和客戶端是一個更好的選擇,有什麼風險,我將如何去實施呢?

謝謝。

回答

1

如果要確保數據包已發送,則需要使用TCP。 UDP不保證傳送,但TCP已將此內置到協議中。

+0

您認爲更好的解決方案是使用TCP/UDP服務器和客戶端建議嗎?謝謝。 – seandewar5 2012-02-04 13:53:20

+0

@ seanewar5我不知道你需要使用兩者。我只會使用TCP。如果遇到嚴重的延遲,那麼您可以切換到使用TCP進行「重要」通信,並使用UDP進行不太重要的通信。 – Jonathan 2012-02-04 13:59:10

+1

@ seanewar5看看這個:http://stackoverflow.com/questions/1099672/when-is-it-closed-to-use-udp-instead-of-tcp – Jonathan 2012-02-04 14:02:33