如何通过TCP实现两个安卓设备之间的通信

22

我们希望在两个Android设备之间建立TCP/IP连接。目前,我们认为如果将连接设备与设备进行,则会更简单。因此,没有服务器位于两个手机之间。

大多数情况下(如果不是始终如此),一个设备没有真正的IP地址(NAT等)。这对创建TCP套接字是否构成问题?我没有找到任何确切的信息。任何建议和意见将不胜感激。

谢谢

5个回答

11
这是否会影响创建TCP套接字?
答案是否定的,这并不会使其变得不可能(除非NAT有一种不可预测的映射IP地址的方式)。但是,要实现这一点并不简单。
简短的回答是,您始终需要类似服务器的对等方具有公共IP地址,以促进位于NAT后面的对等方之间的初始通信。对等方连接到它。 A告诉服务器它想要与B进行TCP连接。服务器通知B。执行NAT行为分析,如果可能的话,A和B尝试通过预测“其他”NAT的下一个映射来彼此打开TCP通信。如果一切顺利(通常都是如此),A或反之亦然联系B。他们关闭其他连接尝试,并使用操作性的TCP连接进行通信。这种技术称为TCP的STUN。
现在,还有更复杂的原因会导致问题。如果您想了解更多信息,请参阅我编写的《实用JXTA II》一书,在Scribd上可以在线阅读。其中有一章专门讨论NAT穿透。
希望这可以帮助你。

0

如果两个节点都没有全局IP,并且不在同一物理网络中,则无法在没有服务器的情况下通过TCP进行通信,除非您创建一个控制服务器作为中继来告诉节点有关另一侧发生的任何更改。


0

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


0

一个设备在NAT后面不是问题。要求是:服务器必须能够被客户端访问。

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


这并没有回答问题...而且,希望其他Android节点有公共IP地址是不现实的。大多数互联网设备都没有公共IP地址。 - Jérôme Verstrynge

0

要创建一个TCP套接字,必须有一个设备在监听,另一个设备在连接。然而,在现实世界的情况下,你所描述的有点困难。 比如,如果你要在两部手机之间通过蜂窝网络进行通信,我不会感到惊讶,如果网络不允许像那样向一个手机发起入站连接,并将每个手机的IP隔离开来。因此,尽管两部手机可能处于相同的子网IP范围内,它们可能不在同一物理网络上,这使得整个路由问题几乎不可能解决。

如果你控制着网络,并且正在使用Wifi并自己进行IP地址转换,同时两个设备都在你的网络中,那么你应该能够像任何其他客户端服务器TCP套接字一样完成此操作。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接