2013-08-25 219 views
3

我正在研究我的多人遊戲中服務器 - 客戶端通信的結構。MulticastSocket多人遊戲

我得出的結論是,UDP是最好的選擇,因爲使用它的方式「不會丟失」,如果數據包丟失,它不會阻止應用程序。 我還將使用TCP發送需要數據包的可靠性,例如在登錄過程和交換信息(如更改服務器,更改地圖,更新等)期間的信息。它還將運行基於IRC的聊天。 (所有的命令實際上都是IRC風格的自定義消息)。

我想知道在服務器和客戶端之間發送交互消息(移動,法術,對象,動作等)的最佳方式是什麼。

閱讀一些我來到MulticastSocket的文檔。

我的問題是:

最好是連續的信息流發送給所有的客戶端啓動一個線程爲每個玩家(我在TCP通訊辦),其中每個DatagramSockets會聽到一個隊列發送的每個新消息給它的客戶。這意味着所有的地圖和所有的移動(假設地圖上可能有50名玩家)將被髮送給所有玩家,並且每個數據包必須更大才能包含所有這些信息。 或者更好地爲每個地圖使用一個線程,只有當某個玩家在特定地圖內時使用多播通信,纔會向該地圖內的玩家發送消息,並使用MulticastSocket偵聽。

我讀了防火牆或路由器使用多播的問題,但我無法弄清楚這些問題可能是什麼(與普通的UDP不同)。

應用程序應該由配置問題少的人使用。

+0

某些路由器被配置爲阻止多播數據包,因爲它們可能會導致網絡上的不期望的業務。試想一下,惡意用戶通過網絡發送虛擬組播數據包,並使用通配符地址。數據包的範圍也很重要。與較小的網絡(如專用LAN)相比,如果數據包位於較大的網絡(例如,互聯網)上,數據包就不太可能到達。至於這是否可以避免(仍然使用多播),我不能給你一個很好的答案。 – initramfs

+0

我不與組播貼,其實這個問題是關於什麼是創建通信服務器客戶UDP的最佳方式,我可以沒有問題更改。 也許我可以創建一個模擬多播套接字的類,一次向多個客戶端發送相同的數據包?但我不知道它是否會足夠快。感謝您的評論 – Gianmarco

+0

我更關心帶寬而非速度。與傳統的每個連接需要數據包的網絡結構相比,多播數據包只發送一次。如果有50個玩家在服務器中,與單個連接的用戶相比,您必須考慮50倍的帶寬。我只是提供了關於多播包的見解。 – initramfs

回答

2

看上面你的場景,你需要決定你的應用程序是否絕對需要TCP連接,因爲TCP連接每個TCP連接需要一個線程,沒有例外(除非使用nio)。

現在的目標程序的UDP部分,你有兩個基本的選擇:

a)你產卵一個線程接收數據報包的所有玩家。

在這種情況下,所有玩家將他們的數據包發送給一個接收器,然後決定如何處理數據。這些數據可能被髮送到各個隊列供其他線程處理。數據可以使用單線程或多線程(每個玩家)發回給所有玩家。

優點:

  • 低資源使用率
  • 低程序(同步)開銷。

缺點:

  • 可能的網絡緩慢(由於分組朝着同一個插座去的羣衆)丟包(再次
  • 較高的機會由於分組的羣衆要去相同的插座)
  • 串行處理
  • 斷開事件很混亂,很難處理

b)您爲每個玩家產生一個線程,並在每個玩家的不同端口上收聽。

在這種情況下,所有玩家都會得到自己的處理線程,這些線程可以直接處理數據或將其發送到中央處理隊列。通過這樣做,可以並行處理數據,從而以更快的資源使用率實現更快的處理速度。同步還需要特別注意,可能需要使用原子和重入讀/寫鎖。寫回到套接字通常應該發生在另一個「每個玩家線程」上。

優點:

  • 並行處理
  • 模塊化(有每個玩家所有的處理代碼在一個線程中,玩家上線啓動連接)
  • 斷開更容易處理和不與其他玩家產生問題。
  • 快速網絡響應,併發包的接收。

缺點:

  • 高資源使用(很多更多的對象)
  • 高同步開銷
  • 高線程數(可多達2〜4倍的線程來的球員比)

在任何一種情況下,通過使用TCP,您將需要需要每個玩家至少有一個線程。問題是你是否願意使用更多的資源來從服務器獲得更平滑,更快速的響應。

+0

接受。謝謝 – Gianmarco