过去几天我一直在做一个在线游戏,一个2人游戏,一个人启动一个服务器(听某个端口),另一个人通过输入他的IP连接到他。这种方法有两个问题:
第一个问题可以通过配对服务来解决,该服务可以在没有用户关注的情况下处理IP。但我不确定如何解决第二个问题。我已经读过“TCP打孔”,但根据我所读到的,当两个玩家都在路由器后面时,不可能执行此操作。如果这是真的,那么像Halo 3这样的配对服务的游戏如何运作呢?
提前致谢。
答案 0 :(得分:1)
你可以使用一种名为UDP Hole Punching的技术,因为游戏UDP可能是更好的选择。但是你仍然需要某种集合服务器来启用客户端的初始握手。
答案 1 :(得分:1)
我相信您的第二个问题也可以通过您的配对服务/服务器来解决。该服务器应该能够知道各自NAT后面的2个玩家的公共IP和端口。服务器将接收的数据包将包含每个播放器的公共IP。服务器所要做的就是将玩家的公共IP +端口转发给另一个。当每个玩家知道另一个玩家的公共IP时,他们应该能够直接相互交谈。但是,NAT遍历技术的成功在很大程度上取决于每个NAT设备的配置。
在VOIP / SIP领域,他们有几个解决这个问题的RFC。查看使用ICE和ICE-TCP的STUN和TURN(针对TCP)。如果你在游戏中实现这些协议可能有点矫枉过正,但我认为它们是学习NAT遍历技术的好资源。
答案 2 :(得分:0)
This question有几个有用的答案,包括这个NAT穿越介绍的链接:http://www.mindcontrol.org/~hplus/nat-punch.html
答案 3 :(得分:0)
你不应该写一个只为找到匹配(AKA服务器列表)负责的配对服务。
更好的解决方案是创建一个玩家可以自动加入的主服务器。主服务器允许创建或加入现有匹配。玩家不应该相互连接,他们应该始终连接到主服务器。
例如,Halo的“主服务器”是Xbox Live。