java - 路由器后面的android套接字编程

标签 java android sockets p2p router

我有一个疑问或问题。我正在尝试在两部安卓手机之间建立 p2p 连接。我让每部电话都连接到我的服务器,我获得了它们的私有(private) (192.168.1.1) 和公共(public) (76.123.288.22) IP 以及它们连接到我的服务器的端口。当手机连接到服务器以打开具有特定端口的服务器套接字时,我会发送响应。我还向另一部手机发送了打开套接字的公共(public) IP 和端口,但它没有连接。我在这里阅读了多个线程,如果手机或计算机都在两个不同的路由器后面,则无法进行 p2p 连接。我的问题是这是否属实,如果属实,LogMeIn 或其他 p2p 应用程序如何在不同的路由器后面工作?是编程错误还是网络架构不允许?

最佳答案

有几种技术可以实现这一点 - STUN , TURN , ICE仅举几例。您可以阅读它们中的每一个,以及 Skype、gtalk(现为 2018 年 3 月的 google talk)等软件使用这些技术。

但这里要理解的主要概念是,

  1. 您需要一个可公开访问的 ip,以便您可以连接到它。如果它在专用网络上的路由器后面,则您需要路由器上的端口转发,即您需要向该路由器添加规则,以将在特定端口上接收到的流量转发到路由器后面的服务器.在某种程度上,上述技术隐含地或通过涉及外部第 3 方服务器实现了这一点。

  2. 您需要在最初连接的机器上允许传入连接。通常 windows 或 linux 防火墙会阻止所有传入连接,除非添加异常(exception)。这可能是您的两个节点都需要的。

对于最后一部分,我不在 android 上编程,所以我不太确定它是否允许为传入连接等添加规则。但我知道 gtalk 有一个 android 客户端,gtalk 使用 XMPP,它在内部可以使用任何我在上面指出的技术。所以没有理由相信为什么它不能在安卓手机上完成。

添加一些更有用的引用:

libjingle (2018 年 3 月更新链接)是 google 的一个开源库,可用于编写 p2p 应用程序,包括文本、音频和视频。

它似乎也被编译为 android here

关于java - 路由器后面的android套接字编程,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13334545/

相关文章:

java - 如何将多个 3D 对象合并为单个网格以消除视觉故障?

java - Jama - 寻找行列式时矩阵必须是平方异常(exception)

java - java android 中的 AndroidPlot

android - GPS 不工作(Android 网络应用程序)

android - 无法获取地址谷歌地图 v2

sockets - 带多宿主的 SCTP 作为 TCP 的直接替代

java - 将 firebase 添加到使用 gradle 构建的 libgdx 项目

java - 降低服务器端报告占用过多内存风险的最佳方法

c - 多客户端服务器、多接口(interface)、多IP版本Socket

java - 当数据包未从服务器发送时,如何在 UDP 客户端中设置超时?