我有一个Android应用程序(通过网络)与桌面服务器应用程序(基于Java和GUI编程)进行通信。现在要测试,我只是有办法在Android手机上指定套接字。但是,将来当我发布应用程序时,我希望它能够尝试自己连接到服务器。
我到目前为止的一些想法是获取手机的IP地址,然后在同一端口上循环通过C类地址空间,并查看是否有任何这些套接字连接。你们有什么别的建议吗?
此外,在Android中获取手机IP地址的最佳方法是什么?我有办法,但它只适用于Android 2.3及更低......在ICS上它完全失败并给出随机乱码。这是:
public String getLocalIpAddress() {
try {
for (Enumeration<NetworkInterface> en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) {
NetworkInterface intf = en.nextElement();
for (Enumeration<InetAddress> enumIpAddr = intf.getInetAddresses(); enumIpAddr.hasMoreElements();) {
InetAddress inetAddress = enumIpAddr.nextElement();
if (!inetAddress.isLoopbackAddress()) {
return inetAddress.getHostAddress().toString();
}
}
}
} catch (Exception ex) {
}
return null;
}
答案 0 :(得分:1)
循环使用C级网络不必要的过度杀伤力。除非作为最后的手段,否则我不会使用它。您的用户可能拥有A级网络(10.x.x.x,在工作场所很受欢迎)或B级,因为...他喜欢它; - )
更好的方法是利用广播地址(如果您愿意,可以使用多播,但这需要更多工作)。您可以基于UDP数据报为您的应用程序实现简单的发现协议。在这种情况下,您的服务器会侦听广播端口,例如UDP 192.168.0.255:6666(您选择的端口),并通过发送IP:PORT来响应任何活动,它正在收听请求者。
Phone->Broadcast: "Is there anybody?"
Server1->Phone : "I am here. Talk to me at 192.168.0.123:6666"
Server2->Phone : "I am here. Talk to me at 192.168.0.124:6666"
客户端然后可以显示可用的服务器并询问用户想要连接的服务器,然后连接到答案中提供的TCP端口(我假设客户端 - 服务器连接是TCP,但它可以是任何东西,想法是一样的)。
答案 1 :(得分:0)
您正在寻找的技术是zero configuration networking,幸运的是,已经实现了一些第三方开源Java库,因此您无需从头开始创建自己的库。我推荐支持java和android的JmDNS,我在我自己的android应用程序中使用它,它运行得很好。
零配置网络已经在许多服务器客户端Android应用程序中广泛使用,请查看我的答案here以获取示例代码。