Android自动搜索服务器
我有一个android应用程序(通过网络)与桌面服务器应用程序(都在Java和基于GUI编程)进行通信。现在来测试,我只是有一种方法来指定Android手机上的套接字。但是,将来当我发布应用程序时,我希望它能够尝试自己连接到服务器。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;
}
循环的C级网络不必要的矫枉过正。除非作为最后的手段,否则我不会使用它。您的用户可能拥有A级网络(10.xxx,在工作场所很受欢迎)或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,但它可以是任何东西,在想法是一样的)。
我使用TCP并设法快速循环通过C类地址空间在几秒钟内找到一台服务器。所以我认为这将是我的最终解决方案。感谢您的输入,下次尝试使用大型客户端 - 服务器应用程序时,我会记住这一点。谢谢! – 2012-02-25 22:05:04
切换到您的方法。效果更好。非常感谢。 – 2012-02-27 06:34:03
@MohammadAdib:你是如何实现这个的? [他们](http://codeisland.org/2012/udp-multicast-on-android/)说,并非所有的Android设备都能正确处理多播,所以你找到了一些最终的解决方案? – infografnet 2013-01-15 10:51:38
您正在寻找的技术是zero configuration networking,幸运的是,已经实现了一些第三方开源java库,因此您不需要从头创建自己的库。我建议JmDNS它支持Java和Android,我用它在我自己的Android应用程序,它工作得很好。
零配置网络已经在很多服务器客户端的android应用程序中被广泛使用,查看我的回答here的示例代码。
我也尝试过(在电话中)自动连接到255.255.255.255:18250,但我的服务器(*:18250)显然没有得到广播... – 2012-02-25 18:34:01