我们想在两个安卓设备之间建立 TCP/IP 连接。现在我们认为如果我们将设备连接到设备会更简单。因此,两部手机之间没有服务器。
大多数时候(如果不是总是)没有真正的 IP 地址(NAT 等)。这是创建 TCP 套接字的问题吗?我没有找到任何确切的信息。任何建议和意见将不胜感激。
谢谢
我们想在两个安卓设备之间建立 TCP/IP 连接。现在我们认为如果我们将设备连接到设备会更简单。因此,两部手机之间没有服务器。
大多数时候(如果不是总是)没有真正的 IP 地址(NAT 等)。这是创建 TCP 套接字的问题吗?我没有找到任何确切的信息。任何建议和意见将不胜感激。
谢谢
这是创建 TCP 套接字的问题吗?
答案是否定的,它不会使它成为不可能(除非 NAT 具有不可预测的映射 IP 地址的方式)。然而,要做到这一点并不简单。
简短的回答是,您将始终需要具有公共 IP 地址的类似服务器的对等点,以促进位于 NAT 后面的对等点之间的初始通信。对等点连接到它。A 告诉服务器它想与 B 建立 TCP 连接。服务器通知 B。执行 NAT 行为分析,如果可能,A 和 B 通过预测另一个NAT的下一个映射来尝试打开彼此的 TCP 通信。如果一切顺利(通常情况下),A 与 B 接触基地,反之亦然。它们关闭其他连接尝试并与可操作的 TCP 连接进行通信。这种技术称为 TCP 的 STUN。
现在,有更复杂的原因导致事情出错。如果您想了解更多信息,我已经写了一本名为 Practical JXTA II 的书,可以在 Scribd 在线阅读。有一章专门介绍 NAT 穿越。
希望这可以帮助。
好吧,要制作一个 TCP 套接字,一个设备必须正在侦听,而另一个设备必须正在连接。但是,在现实世界的场景中,您所描述的有点困难。就像您要通过手机网络在两部手机之间进行通信一样,如果网络不允许入站连接到这样的手机并且只是对每部手机的 IP 进行沙盒处理,我不会感到惊讶。因此,虽然两部电话可能在同一个子网 IP 范围内,但它们可能不在同一个物理网络上,这使得整个路由问题几乎不可能发生。
如果您可以控制网络,并且正在使用 Wifi 并使用网络中的两个设备自己对 IP 进行 nat,那么您应该能够像任何其他客户端服务器 TCP 套接字一样执行此操作。
NAT 后面的一台设备不是问题。要求是:客户端必须可以访问服务器。
我正在使用 Apache Mina 来处理 TCP 连接。它真的让我的生活更轻松了。它可以在客户端和服务器上使用。试试看...
这是可能的,但您可能会遇到一些问题。首先,您必须知道要联系的主机的公共地址,如果您的两个主机位于不同的 NATTED 网络中,您应该使用某些服务器(就像您在 SIP 电话中所做的那样)。然后,您必须希望被联系的主机位于“完整的”NAT 或类似的“好”NAT 后面,而不是位于不允许传入连接的“对称”之类的“坏”NAT 后面。由于三次握手,您使用 TCP 连接而不是 UDP 数据报这一事实可以帮助您。事实上,大多数 NAT 路由器接受传入的 TCP 连接,但不接受传入的 UDP 数据包。
如果两个节点都没有全局 IP,并且物理上不在同一个网络中,那么没有服务器就不可能通过 TCP 进行通信,除非您创建了一个控制服务器作为中继告诉节点任何更改发生在另一边