[英]TCP connection between two android devices (even with NAT)
我正在做一个允许用户在线玩的android应用。
当前,我使用TCP服务器:当两个人连接时,该服务器负责在两个客户端之间转发数据包。
我想用带有Google App Engine的Java Servlet替换我的服务器。 此新服务器将仅用于连接两个播放器。
它将以这种方式工作:播放器A打开服务器套接字,然后将连接详细信息发布到服务器。 当玩家B想要与A对抗时,他向服务器询问A的端口号,并直接连接到A。
问题是,如果播放器A位于NAT之后,我不确定它是否会起作用。 当播放器A打开服务器套接字时,该服务器套接字打开了其192.168.xy地址的一个端口,但是是否向包装盒询问端口转发? 我认为那不是...
所以有两个问题:即使有NAT或防火墙,也可以在两个设备之间建立直接连接TCP(我不知道防火墙在Android上是如何工作的...)如果不可能,那怎么办?最佳解决方案:是否可以制造一个TCP服务器以确保与App Engine交换消息?
预先谢谢你。
首先,设备本身可能不会成为主要问题。 如果他们在家中并使用WiFi,则可能必须处理电缆调制解调器/ DSL调制解调器,该调制解调器通常包括防火墙。 另外,如果他们在工作(或酒店,会议中心等),则可能需要处理公司防火墙。
我相信大多数家用电缆/ DSL调制解调器都支持uPnP(通用即插即用),其中包括Internet网关设备协议(IGD),旨在让设备确定外部IP地址并设置端口映射。 通常,您可以查找NAT遍历,以找到通过家庭调制解调器/防火墙处理连接的方法。 我将注意到,企业防火墙是另一回事,其中许多技术将无法使用。
所以大概我建议您至少准备好以下四种情况
如果您不希望对所有这些可能性进行编程,那么选项4是最有可能起作用的选项,即使它确实意味着去往/来自服务器的额外流量。 但是请注意,对于公司网络,它们可能只是阻止未知连接的规则,因此您可能无能为力。
编辑:我能够在Android上获得一个简单的TCP服务器,而没有任何关于Android本身的特殊要求,因此删除了一条评论,说我对此一无所知。
通常可以在不同NAT下的用户之间创建直接TCP连接。 NAT有4种类型。 FC,ARC,PRC,对称。 如果播放器A或B中的一个具有对称NAT,则无法创建TCP P2P连接。 在这种情况下,您将必须使用中间的服务器在两个播放器之间交换数据。
对于其他类型的NAT组合,这很有可能,但不能保证。 用于创建TCP P2P连接的技术称为TCP打孔。 阅读此答案以了解有关此技术的详细信息。
另外,创建TCP P2P连接与任何平台都不相关。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.