我正在尝试开发一个Android(服务器)应用程序,该应用程序将直接从Internet接受 的TCP连接。几年前,我没有任何尝试。 这有可能吗?
当时我在StackOverflow和其他地方以不同的方式提出了这个问题,但从未得到满意的答案。答案分为两类:
不,您不能
给出的最权威的答案是:大多数运营商不会将连接请求路由到移动设备。
是的,您可以
这些答案没有提供帮助的详细信息或示例。
我尝试过的事情
我可以通过各种方式成功获取移动设备的外部IP。但这只是难题的一部分。请参阅下面的注释1。
我创建了一个侦听端口的ServerSocket(例如2000)。但是该应用程序不接受此套接字上来自Internet的连接。显然,此套接字正在侦听设备的本地(内部)网络(即192.168.1.0)。
我能够从设备上的其他应用程序(位于同一子网上)进行连接。
我还可以通过商店中的NAT路由器进行连接,该路由器将Internet地址转换为设备的本地网络。但这对现场(没有可用的路由器)没有帮助。请参阅下面的注释2。
我尝试问过AT&T客户支持型人员,但我认为他们不理解我的问题。
注释:
我当前的理论(9/23/19)
我目前的谦虚信念是,这里有一个类似NAT的实体在起作用。要么
在这两种情况下,根据这种理论,入站 TCP连接都不会转发到设备的本地网络,但是出站连接可以正常通过。
摘要
也许答案仍然是一样的,但我想我会再问一遍,以防万一情况发生变化或如今人们有了更好的见解,
答案 0 :(得分:0)
这取决于您的手机提供商为您分配的IP类型
要让您的移动设备接受来自外部的TCP连接,只有在您的提供商为您分配了公共IP的情况下才有可能,但这越来越不可能了,因为鉴于可用IP的短缺,许多提供商都为您分配了私有IP,例如手机位于局域网内,在这种情况下,您的TCP端口无法从外部访问。
诸如whatsmyip之类的网站会告诉您提供者最终用来将您连接到互联网的公共IP,但这可能与您的提供者分配给您的电话的IP不同。
要知道您是否正在从Play商店中安装专用网络,请安装一个名为“ PingTools网络实用工具”的应用。 启动时,如果您的电话的IP地址不同于whatsmyip IP或IPV6,则将看到您的电话IP,这意味着提供商将为您分配一个私有IP,这是一个无法访问的IP。
...总是谈论通过蜂窝网络而不是通过WiFi的连接
答案 1 :(得分:0)
为DynDNS等编写一个简单的客户端,以便为其提供名称解析。然后,您可以使用NanoHTP或原始套接字为页面提供服务。如果您在DSL路由器后面,则可能需要使用TR-604读取外部IP(除非DynDNS最终可能会返回源IP),然后为端口:80
上的传入流量设置NAT端口转发。在家里,这比通过UMTS设置更容易,因为某些UMTS网络没有公用IP地址,但可能有私有IP地址。
答案 2 :(得分:0)
的确,您无法建立在主网络(即NAT之后)侦听的任何TCP或UDP连接。如今,所有ISP(由于IP短缺)都为与其连接的每个设备分配了专用IP,因此在NAT之后创建了设备的专用网络。 (IPv6完全采用后,情况会随着每台设备成为主网络的一部分而改变)
由于NAT不允许入站连接,因此可以使用某些NAT遍历技术来解决此问题,例如:
在端口转发过程中,我们需要处理路由器设置,该设置会将特定端口上的连接转发到内部网络节点上的同一端口。它主要用于游戏,VoIP和p2p应用程序。
在打孔技术中(无需处理路由器设置),我们使用不位于任何NAT之后的外部服务器来获取位于NAT之后的设备的IP地址(公共和专用)。此外,两个主机在各自的NAT设备之间相互之间创建自己的出站会话。由于NAT设备允许出站会话,因此将存储该会话,并且将该相同的会话用于进一步的双向通信。 More information about Hole punching.
答案 3 :(得分:0)
(已更新9/26/19)
我发布此“答案”不只是回答本身,而是征求建设性的批评和/或肯定。我在下面所做的任何声明都必须明确地以“我谦卑地相信...”作为前缀。
昨天,我有一个个人的顿悟。我终于通过厚厚的头骨得到了一些回应者所说的话。我在下面介绍我的新理解。
在此之前,我认为AT&T的移动数据网络只是对通过蜂窝站点和干线实现的Internet的直接扩展。现在,我意识到这是一种封闭的私有数据传输机制。由于它是AT&T拥有的,因此他们可以实现他们选择的任何协议,包括从其前端到我注册的电话的“专用”数据连接。这些连接类似于典型的台式NAT路由器的LAN端端口。头端(即其NAT路由器)是只能从Internet访问的 only 实体。
Internet和我的手机之间的头端连接通过这些 AT&T专用连接进行。报告给我的设备(以及我相信附近的设备)的“公共IP”实际上指向AT&T前端(在我的情况下是在迈阿密150英里之外)。头端从手机到Internet的 outbound 连接,但不转发 inbound 连接请求。
关于我的“公共IP”
我相信这是不存在的,实际上是一个毫无意义的概念。如果您无法连接到该地址,那将意味着什么?
摘要
我现在认为,我的原始问题的答案是“不可能,何塞”。这不是由于解决问题引起的,而是AT&T将不将进入的连接路由到设备。他们还不在其专用网络上为设备提供静态IP(鉴于上述情况,这毫无意义)。
如果此原始答案中的任何陈述均不正确,请让我知道其中一项和为何不正确
答案 4 :(得分:0)
我想给出一个非技术性的答案,因为我本人并不精通网络理论。
有一件事是,如果您想运行服务器,Internet提供者通常会期望获得额外的现金-因此,诸如DSL(在此过程中更改IP)之类的消费者订阅被迫断开连接。
接下来的事情是,在移动设备上非常不可靠,建立连接并将数据发送到服务器。您可以让android检查您是否有网络。如果显示“否”,则您无需尝试-表示没有。但是,没什么意思!
我编写了使用android进行资产跟踪的软件。通常,我想每分钟向该服务器发送一个位置。所以我尝试打开一个端口。 Android会在新的Socket上阻塞,即使我事先与ConnectivityManager进行了检查,它也可以持续2分钟,直到发生超时为止,而且它使我得到isConnected()== true。
如果我有一个套接字,甚至在一秒钟前收到了一些消息:我可以写入该套接字,并且没有错误,但是没有答案,请再次写入,没有错误,又一次又没有错误..大约2分钟后,我同时在日志中获取一堆错误。
坐在公共汽车上拜访我的母亲就像通过互联网连接来判断是否穿越了第三世界。它可能说4g和3条,但是chrome无法加载页面,或者说2g只有2条,但浏览器完全没有问题。
整个android网络操作系统(我想苹果必须这样做)的编程方式更像是:“在这里我要发送此android”,而android说“确定”,但认为“我将以很快我就适合这样做”:D
答案 5 :(得分:-1)
您需要一个静态ip(公共ip)地址。
移动设备的IP地址不是静态的,所以不能。
使其工作。
在静态ip上运行Web服务器,并将查询路由到您的应用(隧道)。
启动android应用时,您的android应用需要向网络服务器注册。
现在服务器知道您的android设备可用,来自另一端的查询将被重新编码。