繁体   English   中英

两个Android设备之间的TCP连接(即使使用NAT)

[英]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遍历,以找到通过家庭调制解调器/防火墙处理连接的方法。 我将注意到,企业防火墙是另一回事,其中许多技术将无法使用。

所以大概我建议您至少准备好以下四种情况

  1. 没有任何问题的直接连接。 您可以通过在播放器首次与服务器联系时让服务器建立测试连接来进行测试。 如果这可行,那么事情就简单了。
  2. 了解uPnP的家用NAT设备。 如果您有10.xxx,172.16.xx-172.31.xx或192.168.xx号(典型的家庭WiFi),则可以尝试设置NAT遍历,如果可以,则可以将适当的信息发送到服务器。 为了确保一切正常,服务器进行测试连接可能是值得的。
  3. 如果您有无法绕过的防火墙,请在服务器上记录有关玩家A的信息,然后当B尝试加入A的游戏时,查看B是否会接受连接,如果是,则安排A参加连接到B。
  4. 如果以上方法均无效,则让A和B都连接到服务器,并使服务器在A和B之间中继消息。

如果您不希望对所有这些可能性进行编程,那么选项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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM