Android 上的服务器可以从不在本地网络上的设备访问吗?

Server on Android reachable from devices not on local network?

我一直在尝试设置一个允许在两个设备(服务器和客户端)之间进行通信的应用程序。我已经建立连接并且可以在两者之间发送消息,只要它们连接到相同的互联网源。当我将设备连接到两个不同的来源时,我无法在两者之间建立连接。它通过输入您要连接的服务器的 IP 地址来工作。

例如,如果我的服务器设备连接到我的家庭 Wi-Fi,而我的客户端设备连接到同一个 Wi-Fi 路由器,通信将按预期进行。但是,当我将服务器连接到 Wi-Fi 并将客户端连接到蜂窝数据(或不同的 Wi-Fi 路由器)时,客户端无法找到服务器。

根据我所做的所有搜索,我发现这是因为我的服务器绑定到我的本地主机。所以我的问题是,无论您连接到哪个网络,我怎样才能使我的服务器可以从任何地方访问?

我使用本教程来获取我的服务器 运行:

http://android-er.blogspot.com/2014/02/android-sercerclient-example-server.html

第一个评论是一个问题,询问为什么它只能在本地网络上工作,有人回答说你必须在你的路由器上设置端口转发。据我了解,这仅在服务器设备始终连接到同一路由器时才有效。我的应用程序不会出现这种情况。当设备改变网络时,服务器将有一个新的 IP 地址。无论服务器连接到哪个网络,我都希望这个 IP 地址始终可以访问。

您需要创建中继服务器。这将使用 PC 上的 java 应用程序进行设置,它将管理虚拟 "rooms",然后将消息中继到客户端。您 运行 您的中继服务器关闭的计算机将需要端口转发,但客户端不需要。该教程中的大部分代码都可以应用于此概念。

参见:How to create a java Server that accepts client connections and then build a relay connection for a client pair

如果您的服务器位于防火墙后面,除非该端口在防火墙上打开,否则您将无法访问它。避免这种情况的唯一方法是拥有一个没有防火墙的服务器。