Android自动搜索服务器

我有一个Android应用程序(通过网络)与桌面服务器应用程序(基于Java和GUI编程)进行通信。 现在要测试,我只是有一种方法来指定Android手机上的套接字。 但是,将来当我发布应用程序时,我希望它能够尝试自己连接到服务器。

到目前为止,我所获得的一些想法是获取手机的IP地址,然后在同一端口上循环通过C类地址空间,并查看是否有任何这些套接字连接。 你们有什么别的建议吗?

此外,在Android中获取手机IP地址的最佳方法是什么? 我有办法,但它只适用于Android 2.3及更低……在ICS上它完全失败并给出随机乱码。 这里是:

public String getLocalIpAddress() { try { for (Enumeration en = NetworkInterface.getNetworkInterfaces(); en.hasMoreElements();) { NetworkInterface intf = en.nextElement(); for (Enumeration 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,但它可以是任何东西,想法是相同的)。

您正在寻找的技术是零配置网络 ,幸运的是,已经实现了一些第三方开源Java库,因此您无需从头开始创建自己的库。 我推荐支持java和android的JmDNS ,我在我自己的android应用程序中使用它,它运行得很好。

零配置网络已经在许多服务器客户端Android应用程序中广泛使用,请在此处查看我的答案以获取示例代码。