从 Internet 连接到 Android App 的 Socket:可能吗?

Posted

技术标签:

【中文标题】从 Internet 连接到 Android App 的 Socket:可能吗?【英文标题】:Connect to Android App's Socket from Internet: Possible? 【发布时间】:2020-01-16 04:29:18 【问题描述】:

我正在尝试开发一个 android(服务器)应用程序,该应用程序将直接接受来自 Internet 的 TCP 连接。几年前我尝试过这个,没有任何乐趣。 这可能吗?

我当时在 *** 和其他地方以不同的方式提出了这个问题,但从未得到令人满意的答案。答案分为两类:

不,你不能 给出最权威的答案:大多数运营商不会将连接请求路由到移动设备。

是的,你可以 这些答案没有提供帮助我的详细信息或示例。

我尝试了什么

我可以通过多种方式成功获取我的移动设备的外部IP。但这只是谜题的一部分。请参阅下面的注释 1。

我创建了一个侦听端口(例如 2000)的 ServerSocket。但该应用程序不会在此套接字上接受来自 Internet 的连接。显然,此套接字正在侦听设备的本地(内部)网络(即 192.168.1.0)。

我能够从设备上的其他应用程序(位于同一子网中)进行连接。

我还能够通过商店中的 NAT 路由器进行连接,该路由器将 Internet 地址转换为我设备的本地网络。但这在现场(没有路由器可用)对我没有帮助。请参阅下面的注释 2。

我尝试询问 AT&T 客户支持类型的人,但我认为他们不理解我的问题。

注意事项:

    是的,设备的 IP 地址会随时间或位置而变化,但我始终可以通过各种方式(例如 whatmyip.com 等)获得正确和当前的 IP。尽管如此,使用当前设备 IP 也不起作用。顺便说一句 - 我的公共 IP 从未 改变过。因此,出于所有意图和目的,我的 IP 是静态的。无论如何,IP 问题是一匹被鞭打的马,我相当确定这是一个路由问题,而不是 IP 地址问题。
    我可以通过 WiFi 连接,因为我的 Internet 调制解调器/路由器通过设备本地子网 (192.168.1.) 上的 Wifi 在背面提供 DHCP 连接。我的设备地址为 192.168.1.65,因此我可以连接到它而无需通过我的运营商。
    AT&T 告诉我,我无法为移动设备购买静态 IP(2019 年 9 月 23 日更新)。

我目前的理论 (9/23/19)

我目前谦虚地认为这里有一个类似 NAT 的实体在起作用。要么:

公共 IP 实际上指向 AT&T 总部的 NAT 路由器。 设备内置了类似NAT的路由器

在这两种情况下,根据这个理论,inbound TCP 连接不会转发到设备的本地网络,但 outbound 连接可以正常通过。

总结

也许答案还是一样,但我想我会再问一次,以防万一现在事情发生了变化或有人有更好的见解,

【问题讨论】:

如果您了解 NAT 的工作原理,是什么让您相信运营商会接受非移动发起的连接?虽然不相关,但我相信可以很好地描述操作环境:JDBC vs Web Service for Android 在网络上通信两部智能手机是显而易见的……否则消息服务将如何工作? ...中间有一个服务器,可以从一个和另一个发送和接收数据包..不是你问的辣椒......更好地解释一下自己。 Morrison:关于“非移动连接...”:参考我上面的第四条,我店的调制解调器/路由器通过本地子网 192.168.1.0 上的 WiFi 提供 DHCP 连接。我的手机连接为 192.168.1.65。因此,我可以通过路由器从互联网连接到我的应用程序,而无需通过任何运营商。 Marios:我的谦虚相信是消息服务等通过使用传出连接定期轮询(同步)服务器而不是连接到我的设备。 我所说的“非移动发起”是“非手机发起”。您的问题中描述了两种类型的测试用例。一种是当手机直接连接到运营商并且只收听(不发送)不起作用时,没有人可以将您的IP作为其动态,即从城镇的一侧开车到另一侧。其他是当手机通过您的 DSL、光纤、有线互联网提供商连接到 WiFi 路由器时,IP 是持久的,并且您通过调制解调器端口转发,路由器以侦听模式连接到手机(可能与路由器的 PnP 行为或电话是 DMZ 主机)。 【参考方案1】:

我想给出一个非技术性的答案,因为我自己对网络理论不是很精通。

有一件事是,如果您想运行服务器,互联网提供商通常会期望额外的现金 - 因此强制断开 DSL 等消费者订阅(在此过程中更改 IP)。

接下来的事情是,在移动设备上建立连接并将数据发送到服务器非常不可靠。你可以让android检查你是否有网络。如果它说不,你不需要尝试 - 不意味着不。但是,是的并不意味着什么!

我使用 android 编写用于资产跟踪的软件。通常我想每分钟向该服务器发送一个位置。所以我尝试打开一个端口。 Android 在新 Socket 上阻塞,即使我事先检查了 ConnectivityManager 并且它让我 isConnected() == true,它也可以持续 2 分钟直到发生超时。

如果我有一个套接字,甚至在一秒钟前收到了一些东西:我可以写入那个套接字并且没有错误但没有得到答案,再次写入,没有错误没有分析器一次又一次.. 大约 2 分钟后,我同时在日志中得到一大堆错误。

从互联网连接来看,坐在公共汽车上探望母亲就像开车穿越第三世界国家。它可能会说 4g 和 3 条但 chrome 不会加载页面或它说 2g 并且只有 2 条但浏览器根本没有问题..

整个 android network-os(我猜苹果也必须这样做)的程序更像是:“这里是 android,我想发送这个”,而 android 说“Ok”,但认为“我会发送它”很快我就觉得可以这样做了”:D

【讨论】:

我想你误解了我的问题。我的问题涉及连接到 moblle 设备(入站连接)。我在创建 OUTBOUND 连接时从未遇到过(意外)问题。 我只是想说明为什么没有提供商愿意出售带有静态 IP 的手机合约以使 Android 设备能够作为服务器工作。【参考方案2】:

(2019 年 9 月 26 日更新)

我发布这个“答案”与其说是一个答案本身,不如说是为了征求建设性的批评和/或肯定。我在下面所做的任何陈述绝对应该以“我谦卑地相信……”作为前缀。

昨天,我有一个个人顿悟。我终于通过我厚厚的头骨了解了一些响应者所说的内容。我在下面提出我的新理解。

迄今为止,我认为 AT&T 的移动数据网络只是直接扩展到使用蜂窝站点和中继线实现的 Internet。现在我意识到它是一个封闭的、私有的数据传输机制。由于它归 AT&T 所有,他们可以实施他们选择的任何协议,包括从他们的头端到我注册的手机的“私人”数据连接。这些连接类似于典型桌面 NAT 路由器上的 LAN 端端口。头端(即他们的 NAT 路由器)是可以从 Internet 访问的唯一实体。

互联网和我的手机之间的前端连接是通过这些 AT&T 专用连接。为我的设备(以及我相信附近的设备)报告的“公共 IP”实际上指向 AT&T 前端,在我的例子中,它位于 150 英里外的迈阿密)。前端将 outbound 连接从我的手机转发到 Internet,但不转发 inbound 连接请求。

关于我的“公共 IP”

我认为这并不存在,实际上是一个毫无意义的概念。如果您无法连接到这样的地址,那将有什么意义。

总结

我现在相信我最初问题的答案是“不可能,何塞”。这不是由于寻址问题,而是 AT&T不会将传入连接路由到设备。他们也确实通过其专用网络为设备提供静态 IP(考虑到上述情况,这无论如何都没有多大意义)。

如果此原始答案中的任何陈述不正确,请告诉我哪一项以及为什么不正确

【讨论】:

【参考方案3】:

确实,您无法建立任何在主网络后面(即 NAT 后面)侦听的 TCP 或 UDP 连接。如今,所有 ISP 都为与其连接的每个设备(由于 IP 短缺)分配一个私有 IP,因此在 NAT 后面创建了一个设备的私有网络。 (IPv6完全采用后情况会发生变化,每台设备都成为主网的一部分)

由于 NAT 不允许入站连接,因此可以使用一些 NAT 穿越技术解决该问题,例如:

端口转发 TCP/UDP 打孔

在端口转发过程中,我们需要处理路由器设置,它将特定端口上的连接转发到内部网络节点上的同一端口。主要用于游戏、VoIP、p2p应用。

在打孔技术(无需处理路由器设置)中,我们使用不位于任何 NAT 后面的外部服务器来获取位于 NAT 后面的设备的 IP 地址(公共和私有)。此外,两台主机在它们各自的 NAT 设备中创建自己的出站会话。由于 NAT 设备允许出站会话,因此会存储该会话,并将该会话用于进一步的双向通信。 More information about Hole punching.

【讨论】:

是的,我大体上同意,但恕我直言,NAT 路由器(或等效的)是设备的内部,我无法访问它。 为您的设备分配私有 IP 的路由器位于您的提供商家中,您当然无权访问它。 在打孔方法中,我们不必访问路由器。 绕过提供商端 NAT 的唯一方法是取消合同。【参考方案4】:

为 DynDNS 等编写一个简单的客户端,以便为其提供名称解析。然后,您可以使用 NanoHTP 或原始套接字提供页面。如果您在 DSL 路由器后面,您可能需要使用 TR-604 读取外部 IP(除非 DynDNS 最终可能返回源 IP)并为端口 :80 上的传入流量设置 NAT 端口转发。在家里,这比通过 UMTS 更容易设置,因为一些 UMTS 网络没有公共 IP 地址,但可能有私有 IP 地址。

【讨论】:

再一次,这不是地址问题,而是路由问题。 你不必大喊也不必重复,因为我既不聋也不笨。而当您从您的 ISP 获得一个 natted 私有 IP 时 - 这将无法在公共网络中路由。例如。 Comcast 甚至为 DSL 设置了这种方式——而对于 UMTS 订阅,它更常见。事实上,当你的地址在错误的范围内时,这将是一个路由问题。外部 IP 地址不一定总是可公开路由的 IP 地址。 抱歉。我不是要大喊大叫——只是强调。我再说一遍,因为每个人都在谈论“静态”IP。我的外部 IP 永远不会改变,因此在此之前它实际上是一个静态 IP。我想我很无知:我不明白什么是“natted private IP”。到目前为止,我认为只有两种类型的地址:(1)公共 IP 和(2)路由器 LAN 端的私有 IP(例如 192.168.X.X 或 10.X.X.X)。 继续 - 您是说有另一种 ISP 专有类型的地址可以通过他们的移动数据网络路由,但不能通过 Internet?请原谅我的无知,但我很想得到启发。 ISP 提供 NAT 的 @DontPanic 是一种专有的连接方式;普通它只是:路由器外部IP(公共)->路由器内部IP(私有)->主机IP(私有)。您从本地路由器获得的 NAT 可以配置,但提供商侧的 NAT 对其影响为零。只需在您的路由器上检查外部 IP 是什么 - 如果它是公共 IP,则可以将端口转发到移动设备的 IP。 DynDNS 仅对动态外部 IP 有用,因为它为不断变化的 IP 地址提供名称解析(每当 DHCP 租约用完或重新连接时)。【参考方案5】:

你需要一个静态 ip(public ip) 地址。

移动设备IP地址不是静态的所以你不能。

让它发挥作用。

在静态 IP 上运行 Web 服务器并将查询路由到您的应用(隧道)。

当安卓应用启动时,你的安卓应用需要注册到网络服务器。

现在服务器知道你的android设备的可用性,来自另一端的查询将被重定向。

【讨论】:

恕我直言,我认为这是不正确的。静态IP所做的只是使服务器的IP地址保持不变,以便人们将来可以连接到它,即地址不会改变。顺便说一句 - 我的设备(动态)IP 多年来没有改变。 这是所有消息和聊天应用程序的工作方式(在 STUN 、TURN 、ICE 服务器的帮助下),有时运营商分配的设备 IP 地址可能相同。但并非总是如此。这就是中间服务器出现的原因。如果您能够通过 Internet 从远程网络 ping 您的移动设备运营商 IP,那么您的应用程序应该可以正常工作一段时间。您的 ping 命令是否从远程网络成功? 我的外部 IP永远都是一样的。是的,我可以从互联网上 ping 它。 我撤回任何关于“我的公共 IP”的声明。我现在认为这是一个毫无意义的概念。请参阅我的原始答案。【参考方案6】:

这取决于您的手机提供商分配给您的 IP 类型

要让您的移动设备接受来自外部的 TCP 连接,只有当您的提供商为您分配一个公共 IP 时才有可能,但这越来越不可能,因为由于可用 IP 的短缺,许多提供商分配一个私有 IP,例如如果您的电话位于 LAN 内,在这种情况下,您的 TCP 端口无法从外部访问。

whatsmyip 等网站会告诉您供应商最终将您连接到互联网的公共 IP,但它可能与供应商分配给您手机的 IP 不同。

要了解您是否在专用网络中,请从 Play 商店安装名为“PingTools Network Utilities”的应用。 当您启动它时,您会看到您手机的 IP,如果它与 whatsmyip IP 不同或者是 IPV6,这意味着您的提供商为您分配了一个私有 IP,一个无法访问的 IP。

...总是谈论通过蜂窝网络而不是通过 WiFi 的连接

【讨论】:

Ping Tools 显示 same 地址与 whatsmyip。另外,我不知道您所说的“私有 IP”是什么意思。 @DontPanic:私有 IP 是未在 Internet 中路由的 IP(未用于公共流量)。通常,您可以通过 NAT 路由器后面的 DHCP 服务器获得这样的 IP。典型的私有 IP 范围是 192.168.x.x 或 10.x.x.x。 我的意思是显示在 Ping 工具屏幕左上角的 IP。电话IP。如果提供商为您分配公共 IP,则它应该与 whatsmyip 相同。 公网IP始终不变(多年未变)。顺便说一句 - 我试过很多工具,比如 Ping Tools,它们说的都是一样的。 重要的是手机的IP是公网IP,不管是静态的还是动态的,变不变。如果您的手机在专用网络中,正如大多数提供商目前所做的那样,您的端口将无法访问。我的意思是手机的IP,而不是whatsmyip IP

以上是关于从 Internet 连接到 Android App 的 Socket:可能吗?的主要内容,如果未能解决你的问题,请参考以下文章

从 Internet 连接到 xampp 数据库

通过USB连接到Xamarin.Android应用程序与网站进行通信

无法从私有子网中的实例连接到 Internet

如何以编程方式扫描、查找和连接到开放的 wifi AP?

如何获取 wifi AP 列表并从 Windows 商店应用程序连接到一个 AP

通过 Internet 连接到数据库