我应该使用TCP进行在线游戏吗?

时间:2011-11-15 20:58:12

标签: c# tcp xna multiplayer

我有一个回合制游戏,其中两个玩家可以互相对战。

它是用C#编写的,并使用XNA 4.0。

目前,多人游戏是使用TCP / IP实现的。它工作得很好,但只有当玩家在同一个网络中时,其中一个知道另一个的IP。

所以问题是:我该如何实现这个游戏的在线游戏? TCP是一种合理的方法,可以连接世界两端的两个随机播放器而无需处理IP地址和端口(或任何其他此类技术细节)?

为了使这个问题更具挑战性,我没有托管游戏匹配服务的服务器。 (好吧,我可以访问虚拟Web服务器,我可以用它来共享IP。)

列出问题:

  • .NET提供比TCP更好的通信方法选择吗?
  • 在我的情况下,处理NAT的最佳方法是什么?
  • 有没有一种便宜的方式来获取我自己的服务器并在那里运行TCP游戏匹配服务?

4 个答案:

答案 0 :(得分:2)

您需要指定预期和容忍的负载和延迟类型。

一般答案是:

  • 对于实时游戏 - UDP。

  • 对于类似拼字游戏的游戏 - TCP。

使用您的服务器按照您的说法共享IP。

答案 1 :(得分:2)

TCP与UDP。

TCP比UDP慢一点,但更安全。

由于你的游戏是基于回合制的,它可能会在客户端和服务器之间发送最少量的数据,并且它实际上并不依赖于延迟,我想你也可以选择TCP。

  

为了使这个问题更具挑战性,我没有托管游戏匹配服务的服务器。 (好吧,我可以访问虚拟Web服务器,我可以用它来共享IP。)

如果您要为您的玩家提供服务器浏览器或类似服务器,您需要拥有一个中央服务器,一个带有脚本/应用程序的Web服务器就可以了。

  
      
  • 有没有一种便宜的方式来获取我自己的服务器并在那里运行TCP游戏匹配服务?
  •   

网络服务器或类似主机可以做得很好而且通常很便宜,你想要的是:

  • 服务器将其自身添加到服务器列表的功能。
  • 客户端检索列表中服务器的功能。

使用C#进行Web请求完全没有问题,请求可能类似于:

http://www.example.com/addToServerList.php?name=MyEpicServer&ip=213.0.0.ABC(将此服务器添加到列表中)

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

答案 2 :(得分:0)

Minecraft使用TCP。这对于必须传输和接收的流量是有益的,并且可以排队一点。

答案 3 :(得分:0)

UDP是单向错误检查。只有接收方检查错误。这是旧的慢速以太网技术所需要的,其中检查数据包的往返速度太慢。

TCP是一种非常可靠的握手协议。因此发送方知道数据是否成功传输。但是由于往返,它会增加更多的开销并延迟传输。

TCP也会安排数据包,UDP也不会这样做。

有些游戏并不介意丢失数据包(例如“蒸汽”数据,其中对象移动,并且无论如何它将更新下一轮数据包)。在那里你可以使用UDP。但是,如果获取所有数据至关重要,而不是使用TCP,否则您将花费​​大量时间编写代码以确保所有数据都成功传输。

网络足够快,互联网是TCP / IP我推荐TCP,除非你真的需要非常低的延迟流量。

本网站提供了一个很好的总结: http://www.diffen.com/difference/TCP_vs_UDP

NAT:只要您的生存时间(TTL)足够大,就不应该成为问题。每次获得NAT时,它的TTL减去1。当它为0时,它会被删除