2011-11-15 38 views
1

我有一個回合制遊戲,其中兩個玩家可能會對彼此玩。我應該使用TCP進行在線遊戲嗎?

它用C#編寫,並使用XNA 4.0。

目前多人遊戲是通過TCP/IP實現的。它的工作原理非常好,但前提是玩家在同一個網絡中,其中一個知道另一個的IP。

所以,問題是:我應該如何實現了這個遊戲的在線遊戲? TCP是一種合理的方法,可以連接來自世界各地的兩個隨機玩家,而不必處理IP地址和端口(或任何其他此類技術細節)?

爲了使這個問題更加具有挑戰性,我沒有服務器託管的遊戲配套服務。 (好吧,我得,我可以使用共享IP地址的虛擬Web服務器的訪問。)

列出的問題:

  • 確實.NET提供了更好的選擇,而不是TCP通信的方法嗎?
  • 在我的情況下處理NAT的最佳方式是什麼?
  • 有沒有一種便宜的方法讓我自己的服務器在那裏運行TCP遊戲匹配服務?
+0

絕對是一個TCP粉絲......這裏投票把它遷移到Programmers.SE。 – Fosco

+1

我會說gamedev是更合適的,如果有的話。 –

+1

@Fosco爲什麼遷徙?這是一個事實上的編程答案可用的問題。 – stefan

回答

2

TCP vs UDP。

TCP比UDP慢了一點,但更多的故障保護。

因爲你的遊戲是基於關閉它可能會發送最小量的客戶端和服務器之間的數據,這是不是真的延遲依賴,我會說你可能藏漢去TCP。

爲了使這個問題更具挑戰性,我沒有服務器來託管遊戲匹配服務。 (好吧,我要,我可以使用共享IP地址的虛擬Web服務器的訪問。)

如果你要提供你的球員有一個服務器瀏覽器或類似的,你需要有一個集中的服務器,一個爲此編寫腳本/應用程序的Web服務器將會很好。

  • 有沒有得到我自己的服務器,並運行TCP遊戲配套服務存在的一種廉價的方式?

Web服務器或類似的主機會做就好了,通常是便宜的,你想要的是:

  • 功能的服務器將自身添加到服務器列表。
  • 客戶端檢索列表上的服務器的功能。

否則用C#Web請求是一點問題都沒有,請求可能類似於:

http://www.example.com/addToServerList.php?name=MyEpicServer&ip=213.0.0.ABC(增加了該服務器的列表)

http://www.example.com/getOnlineServers.php(所有服務器返回列表)

0

的Minecraft使用TCP。對於必須傳輸和接收的流量很有用,並且可以稍微排隊。

+1

Minecraft是糟糕的代碼,不應該作爲一個例子。 –

+5

這只是一個使用TCP的遊戲。我沒有說這件事。 – dataviruset

2

您需要指定預期和允許的負載和延遲類型。

一般的回答是:

  • 對於實時遊戲 - UDP。

  • 對於拼字遊戲般的遊戲 - TCP。

如您所說,使用您的服務器共享IP。

+0

鑑於它是基於回合的,我會說TCP的聲音是正確的。 –

+3

@George:對於基於回合的遊戲,您可以 - 根據數據甚至考慮連接到房間的Web服務等。這樣你就不需要共享IP了,你將能夠繞過防火牆。 – stefan

+0

作爲一款基於回合的遊戲,低延遲並不是優先考慮事項。 我想我可以放心地說,每一回合的數據可以很容易地打包成256字節。 但是,我應該使用Web服務,是不是要求玩家經常查詢服務器的消息,比如說每秒一次?是否存在將遊戲標記爲DoS攻擊的威脅? – Habba

0

UDP是單向錯誤檢查。只有接收方檢查錯誤。以前的慢速以太網技術需要這樣做,因爲往返檢查數據包的速度太慢。

TCP是一個非常可靠的握手協議。所以發送方知道數據是否傳輸成功。但由於往返旅程,它會在傳輸上造成更多的開銷和滯後。

TCP也做排列數據包,UDP也不這樣做。有些遊戲並不介意丟失數據包(例如對象在四處移動的「蒸汽」數據,無論如何都會更新下一輪數據包)。在那裏你可以使用UDP。但是,如果獲取所有數據至關重要,而不是使用TCP,否則您將花費​​大量時間編寫代碼以確保所有數據傳輸成功。

網絡速度很快,互聯網是TCP/IP我推薦TCP,除非你真的需要非常低的流量。

該網站提供了一個很好的總結: http://www.diffen.com/difference/TCP_vs_UDP

NAT:就像只要不應該是一個問題,因爲你的生存時間(TTL)足夠大。每次獲得NAT時,都會將TTL減1。當它爲0時,它會丟失

+0

這是不正確的。首先,UDP與TCP一樣「低級」,它們都是傳輸層協議。其次,兩者都通過「校驗和」字段提供錯誤檢查。 –

相關問題