【发布时间】:2016-10-26 19:14:58
【问题描述】:
我正在开发一个套接字应用程序。
背景:
- 有两个安卓设备。
- 两台设备都在不同的网络上(即一台在移动网络上,另一台在不同的移动网络或 wifi 上)。
- 应用在同一个 wifi 网络上运行良好。
- 应用无法在不同的网络上运行。
- 我读过关于端口转发的文章,但这一切都以路由器端口转发告终,所以这与我的应用程序无关,因为我的应用程序喜欢在不同的网络上工作。
我的尝试:
我使用以下方法获得了服务器 ip 地址,它给了我 ip 地址:
public String getIpAddress() {
String ip = "";
try {
Enumeration<NetworkInterface> enumNetworkInterfaces = NetworkInterface
.getNetworkInterfaces();
while (enumNetworkInterfaces.hasMoreElements()) {
NetworkInterface networkInterface = enumNetworkInterfaces
.nextElement();
Enumeration<InetAddress> enumInetAddress = networkInterface
.getInetAddresses();
while (enumInetAddress.hasMoreElements()) {
InetAddress inetAddress = enumInetAddress.nextElement();
if (inetAddress.isSiteLocalAddress()) {
ip += "Server running at : "
+ inetAddress.getHostAddress();
}
}
}
} catch (SocketException e) {
// TODO Auto-generated catch block
e.printStackTrace();
ip += "Something Wrong! " + e.toString() + "\n";
}
text.setText(ip);
return ip;
}
我正在使用静态端口 8080 [可能是这个问题,如果是,请给我一个选项]。
我在客户端使用这条线进行连接,但 soket 对象在不同的网络上返回 null:
InetAddress serverAddr = InetAddress.getByName(SERVER_IP);
socket = new Socket(serverAddr, SERVERPORT);
所以,请建议我应该用什么来沟通 具有不同网络的不同真实android设备[应用程序运行在同一个 网络完美]?
【问题讨论】:
-
灾难之路。您可能总是需要配置路由器才能做到这一点。并且 8080 主要路由到一些 HTTPS 主机。恕我直言,您最好的选择是在公共互联网上拥有一个公共服务器,以便从两个设备连接。
-
@Fidor 谢谢回复 我跟路由器没关系,请给我解释一下普通服务器
-
手持设备的问题是,您无法知道您在谁的网络中。在您自己的网络中,您可以将路由器配置为将端口路由到您的设备,该设备接受该端口的连接。例如,您不可能配置公共接入点或移动网络来执行此操作。因此,您需要互联网中的公共主机才能从任何地方连接。然后您就可以与该服务器进行双工通信。然后后者必须将消息从一个连接转发到另一个。
-
@Fildor 好的。让我找出在不同设备和不同网络上进行套接字操作的其他选项,因为我已经完成了一半的项目。
标签: java android sockets networking