2011-11-15 36 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一样“低级”,它们都是传输层协议。其次,两者都通过“校验和”字段提供错误检查。 –

相关问题