我有一个在 C# 应用程序上运行的服务器。还有一个 Android 应用程序上的客户端,这两个只有在同一个网络上并且只能使用私有地址 192.168.1 时才能通信。*我如何使它适用于公共 IP 地址。如在,Android 应用程序也可以从家庭网络外部进行通信
1 回答
您几乎永远无法通过 Internet 使用 TCP 将手机直接连接到计算机的原因是,您的一台或两台设备通常位于一个或多个防火墙、网关、路由器、代理或NAT之后。
设备将只能启动与具有公共 IP 地址的侦听服务器的连接。例如,尽管您的家用计算机很可能落后于上述之一,但您可以打开http://www.stackoverflow.com,因为 StackOverflow 网络服务器具有公共 IP。
您的手机也是如此。在大多数情况下,您手机的 ISP(移动提供商)不会为您的手机分配公共 IP,即使这样做,它也可能会阻止或过滤大多数数据包,从而很难将手机用作侦听服务器。
你有什么选择?
端口转发。将您家的接入路由器转发到您的 PC 是一个很好的测试选择。(如果您希望与数千个客户一起运行某种服务,它会变得更加复杂。
使用端口转发,您首先需要确保您可以配置您的路由器(例如,我在我的建筑物中无权访问它)。如果您确实有权访问路由器的配置,请设置端口转发(例如,访问路由器上端口 12345 的任何内容都将转发到 PC 上的 12345)。接下来,确定路由器的公网 IP ( http://www.wimi.com )。最后,尝试使用路由器的 IP 从手机连接。请记住,您的路由器的公共 IP 地址很可能不是静态的,并且可能随时更改。
使用中间人。一个常见的选择是使用公开可用的服务器来保持两者的联系。使用 Web 服务器和常规 HTTP 或 HTTPS 连接是最安全的(即最不可能在此过程中被阻止)。因此,例如:
- 电话给中间人:我有什么消息吗?
- 中间人回答:不,对不起。
- PC 对中间人:说“嗨!” 请给电话。
- 中间人回答:好的,我会的。
- 电话给中间人:我有什么消息吗?
- 中间人回答:是的,PC 说“嗨!”
请注意,每个连接都是由 PC 或电话发起的。中间人可以回答查询,但它不能自己启动连接(因为电话和 PC 都无法访问)。
虽然我会说这可能是从一个到另一个获取消息的最简单方法,但有相当多的开销并且延迟不会很大。当然,如果您不介意弄脏自己的手,或者至少您的家用路由器是可配置的,那么当然还有其他选择。查看端口转发和SSH 隧道。
获取静态公网 IP。IPv4 复杂且昂贵,但它可以解决您的大部分问题,特别是如果您正在考虑运行某种服务。