2008-10-17 146 views
12

MMORPG客戶端/服務器通信中使用的UDP和TCP協議如何?MMORPG客戶端/服務器編碼

例如:

客戶是否廣播(玩家位置等),通過UDP服務器?或相反亦然?

或者更像是在客戶端請求服務器移動播放器時使用TCP。服務器收到請求後,移動播放器並將播放器返回給客戶端,現在播放器位於xyz位置?

聊天頻道必須使用TCP來實現嗎?

有沒有關於此的好文章/書籍?我發現了點點滴滴,但看起來真正的肉和土豆是從經驗中獲得的。

回答

1

你的問題的一半(使用傳輸層協議)可以通過安裝wireshark並查看流量來應答。

0

除了作爲玩家的觀察,我不知道任何細節,但大多數遊戲絕對不會等待服務器回覆來移動角色,除非它是基於回合的角色,否則會殺死用戶體驗。看起來會發生什麼是運動完成客戶端併發送到服務器,然後將這些消息發送給其他玩家。至少在魔獸世界裏,如果一名球員落後了,你可能會看到他們仍在向前移動,然後奇蹟般地出現在另一個位置,這對我說,客戶收到的不僅僅是位置數據,還包括他們正在移動以及他們移動的方向然後在沒有更多數據的情況下推斷運動。

0

你最好打賭的可能是看看Planeshift的網絡代碼,它是一個開源的MMO。我相信這是現場最發達的(最後我檢查過)。

8

很多遊戲使用UDP進行移動相關的活動 - 所以,就像你走路時一樣,很可能會發送一堆UDP請求。服務器最終仍然控制着它是否有效,但是你不一定關心每個數據包是否都到達服務器。這就是爲什麼很多遊戲客戶也使用某種預測機制。

就你提到的第二點而言,是的,所有控制器都是由服務器管理的。您不希望客戶將任何內容廣播到服務器;你應該做錯誤和輸入處理服務器端,以防止黑客攻擊。您可能還會限制每秒輸入。

無論如何,UDP和TCP的組合是合適的 - 你只需要問自己:「我想要可靠性還是速度?」

4

有許多不同的可能的實現,但大多數情況下,它們看起來像這樣。遊戲世界中的任何動作都會重複這種模式。

  1. 客戶端與服務器通信,玩家想要移動。
  2. 客戶端根據它認爲應該發生的事情來顯示播放器的移動。
  3. 鑑於玩家的位置,服務器驗證移動是否可能發生。
  4. 服務器更新客戶端,以確定玩家在服務器上的位置。
  5. 客戶端更新玩家位置以反映服務器的世界狀態。
1

您可能會感興趣Project Darkstar。這是一個開源的MMO框架。

+0

我認爲這是[RedDwarf Server](http://www.reddwarfserver.org/)。只是爲了保持最新。 – 2012-05-29 20:14:56

4

你不能依靠客戶端傳遞真實的信息。有人會破解協議和作弊。加密數據不會阻止這一點 - 只是讓它難以做到。

客戶端只應發送移動請求等,服務器需要檢查請求以確保它們不違反遊戲規則。服務器只應發回客戶端絕對需要的數據 - 您不能依賴客戶端獲取大量世界數據,只能過濾掉玩家當前無法觀察的所有內容。有人會獲得額外的信息並利用它。

如果遊戲需要'實時',那麼客戶端需要假定服務器將允許移動請求並相應地更新顯示 - 如果服務器稍後進行了更正,則會回滾移動。在大多數情況下,客戶端和服務器都會同意,一切都會順利進行。當客戶試圖作弊時(這是他們的錯誤) - 或者由於連接不好導致客戶嚴重滯後(對此可能沒有太多可以做到)。

0

我不認爲這個問題有一個簡單的答案,它的範圍相當廣泛。還有幾點:

  • 沒有必要僅僅因爲使用UDP而「廣播」。根據我的經驗,UDP大部分時間都是點對點的。
  • 完全可以通過UDP進行自己的「安全」通信,而不必使用TCP。這不是神奇的,只是......聰明而複雜。 :)但大多數情況下,正如你所暗示的那樣,TCP不適用於遊戲中的實時通信。
  • 有些方法可以使TCP更合適,例如搜索「Nagle算法」。
  • 如果你已經在自己的無損傳輸協議的基礎上實現了,你可以通過UDP進行聊天。很多遊戲都是這樣的。

有關於Gamasutra網絡的文章,但我現在沒有任何鏈接。不知道他們是否仍然公開提供,對不起。

1

我想你可以通過閱讀其他人如何實現這些類型的系統來學習很多。在這種徒勞的,我可以指出你的蒂姆·斯威尼工作的槌球協會

  1. Unrea Networking Architecture
  2. The Croquet Project

蒂姆·斯威尼的論文轉化我想對編程的想法。我無法推薦他們。