如何让两个android设备通过TCP进行通信

Posted

技术标签:

【中文标题】如何让两个android设备通过TCP进行通信【英文标题】:How to make two android devices to communicate through TCP 【发布时间】:2011-05-30 10:27:21 【问题描述】:

我们想在两个安卓设备之间建立 TCP/IP 连接。 现在我们认为如果我们将设备连接到设备会更简单。所以两部手机之间没有服务器。

大多数时候(如果不是总是)没有真正的 IP 地址(NAT 等)。这是创建 TCP 套接字的问题吗? 我没有找到任何确切的信息。任何建议和意见都将受到高度赞赏。

谢谢

【问题讨论】:

【参考方案1】:

这是创建 TCP 的问题吗 插座?

答案是否定的,但这并不意味着不可能(除非 NAT 具有不可预测的 IP 地址映射方式)。但是,要做到这一点并不容易。

简短的回答是,您始终需要具有公共 IP 地址的类似服务器的对等方,以促进位于 NAT 后面的对等方之间的初始通信。对等点连接到它。 A 告诉服务器它想与 B 建立 TCP 连接。服务器通知 B。执行 NAT 行为分析,如果可能,A 和 B 通过预测 other 的下一个映射来尝试打开彼此的 TCP 通信NAT。如果一切顺利(通常情况下),A 与 B 接触基地,反之亦然。它们关闭其他连接尝试并与可操作的 TCP 连接进行通信。这种技术称为 TCP 的 STUN。

现在,出现问题的原因更为复杂。如果您想了解更多信息,我已经写了一本名为 Practical JXTA II 的书,可以在 Scribd 在线阅读。有一章专门介绍 NAT 穿越。

希望这会有所帮助。

【讨论】:

【参考方案2】:

NAT 后面的一个设备不是问题。要求是:客户端必须可以访问服务器。

我正在使用 Apache Mina 来处理 TCP 连接。它真的让我的生活更轻松。它可以在客户端和服务器上使用。试一试...

【讨论】:

这并不能回答问题...而且,希望其他 android 节点拥有公共 IP 地址是不现实的。互联网上的大多数设备都没有公共 IP 地址。【参考方案3】:

要创建 TCP 套接字,必须有一个设备正在侦听,而另一个设备必须连接。然而,在现实世界的场景中,您所描述的有点困难。 就像您要通过手机网络在两部手机之间进行通信一样,如果网络不允许入站连接到这样的手机并且只是对每部手机的 IP 进行沙盒处理,我不会感到惊讶。因此,虽然两部电话可能在同一个子网 IP 范围内,但它们可能不在同一个物理网络上,这使得整个路由问题几乎不可能发生。

如果您可以控制网络并使用 Wifi 并自己使用网络中的两台设备对 IP 进行 nat,那么您应该能够像任何其他客户端服务器 TCP 套接字一样执行此操作。

【讨论】:

【参考方案4】:

如果两个节点都没有全局 IP,并且物理上不在同一个网络中,那么没有服务器就不可能通过 TCP 进行通信,除非您创建了一个控制服务器作为中继来告诉节点关于另一边发生的任何变化

【讨论】:

【参考方案5】:

这是可能的,但您可能会遇到一些问题。 首先,您必须知道要联系的主机的公共地址,如果您的两个主机位于不同的 NATTED 网络中,您应该使用某些服务器(就像您在 SIP 电话中所做的那样)。 然后,您必须希望被联系的主机位于“完整的”NAT 或类似的“好”NAT 后面,而不是位于不允许传入连接的“对称”之类的“坏”NAT 后面。由于三次握手,您使用 TCP 连接而不是 UDP 数据报这一事实可以为您提供帮助。事实上,大多数 NAT 路由器都接受传入的 TCP 连接,但不接受传入的 UDP 数据包。

【讨论】:

以上是关于如何让两个android设备通过TCP进行通信的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Android 中高效地与 UI 线程通信?

没有一致的方式通过 TCP 连接 ADB

原创技术分享200SMART通过TCP协议创建到另一设备的链接

android设备 如何通过mac地址知道ip地址

通过 Wi-Fi 使用 TCP 将 Android 应用程序连接到 IoT 设备

如何在 C# 桌面应用程序和移动(android)设备之间通过本地网络进行通信? [关闭]