如何使两个Android设备通过TCP进行通信

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

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

谢谢

这是创建TCP套接字的问题吗?

答案是否定的,它不会使它成为不可能(除非NAT有一种不可预测的映射IP地址的方式)。 但是,实现起来并不容易。

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

现在,事情可能出错的原因更为复杂。 如果你想了解更多,我写了一本名为Practical JXTA II的书,可以在Scribd在线阅读。 有一章专门讨论NAT遍历。

希望这可以帮助。

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

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

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

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

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

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