我应该在在线游戏中使用TCP吗?
本文关键字:TCP 在线游戏 我应该 | 更新日期: 2023-09-27 18:14:49
我有一款回合制游戏,两名玩家可以互相对抗。
用c#编写,使用XNA 4.0。
目前多人游戏是通过TCP/IP实现的。它工作得很好,但前提是玩家在同一网络中,其中一个知道另一个的IP。
所以问题是:我应该如何实现这款游戏的在线玩法?TCP是一个合理的方法来连接两个随机玩家从世界的两端,而不必处理IP地址和端口(或任何其他类似的技术细节)?为了使这个问题更具挑战性,我没有服务器来托管游戏匹配服务。(嗯,我可以访问一个虚拟的web服务器,我可以用它来共享ip。)
列出问题:
- .NET是否提供了比TCP更好的通信方式选择?
- 在我的情况下,处理nat的最好方法是什么? 是否有一种廉价的方式来获得我自己的服务器并运行TCP游戏匹配服务?
TCP vs UDP
TCP比UDP慢一点,但更安全。
因为你的游戏是回合制的,它可能会在客户端和服务器之间发送少量的数据,并且它不是真正的延迟相关,我想说你可能会选择TCP。
为了使这个问题更具挑战性,我没有服务器来托管游戏匹配服务。(嗯,我可以访问一个虚拟的web服务器,我可以用它来共享ip。)
如果你打算为你的玩家提供服务器浏览器或类似的东西,你需要有一个集中的服务器,一个带有脚本/应用程序的web服务器就可以了。
是否有一种廉价的方式来获得我自己的服务器并运行TCP游戏匹配服务?
一个web服务器或类似的主机就可以了,通常很便宜,你想要的是:
- 服务器将自己添加到服务器列表的功能。
- 客户端检索列表中服务器的函数。
用c#做web请求完全没有问题,请求可以看起来像这样:
http://www.example.com/addToServerList.php?name=MyEpicServer&ip=213.0.0.ABC(将此服务器添加到列表中)
http://www.example.com/getOnlineServers.php(返回所有服务器的列表)
您需要指定期望和容忍的负载和延迟类型。
一般答案是:
-
实时游戏- UDP
-
For scrabble-like-games - TCP.
使用你的服务器共享IP
Minecraft使用TCP。
UDP是单向错误检查。只有接收方检查错误。这是旧的慢以太网技术所需要的,因为来回检查数据包的速度太慢了。
TCP是一个非常可靠的协议与握手。因此发送方知道数据是否传输成功。但是由于往返,它给传输带来了更多的开销和延迟。
TCP也安排数据包,UDP也不这样做。
有些游戏它并不介意丢失数据包(例如,在物体移动的地方"蒸"数据,无论如何它都会在下一轮数据包中得到更新)。在那里你可以使用UDP。但是,如果获取所有数据至关重要,不如使用TCP,否则您将花费大量时间编写代码以确保所有数据都能成功传输。
网络足够快,互联网是TCP/IP,我推荐TCP,除非你真的需要非常低的延迟流量。
这个网站给出了一个很好的总结:http://www.diffen.com/difference/TCP_vs_UDP
NAT:应该不是一个问题,只要你的生存时间(TTL)足够大。每次它得到NAT,它的TTL就被减去1。当它为0时,它被删除