【问题标题】:Android search for server automaticallyAndroid自动搜索服务器
【发布时间】:2012-02-25 18:31:17
【问题描述】:

我有一个 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;
}

【问题讨论】:

  • 我也试过(在电话上)自动连接到 255.255.255.255:18250 但我的服务器(*:18250)显然没有收到广播...

标签: java android sockets client


【解决方案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,但它可以是任何东西,想法是一样的)。

【讨论】:

  • 我正在使用 TCP 并设法在几秒钟内快速遍历 C 类地址空间以找到服务器。所以我认为这将是我的最终解决方案。感谢您的意见,下次我尝试大型客户端 - 服务器应用程序时,我会牢记这一点。谢谢!
  • @MohammadAdib:你是如何实现这个的? They 说,并不是所有的安卓设备都能正确处理多播,所以你找到了一些终极解决方案吗?
【解决方案2】:

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

零配置联网已经在很多服务器客户端android应用中得到广泛应用,示例代码查看我的回答here。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2011-04-26
    • 1970-01-01
    • 1970-01-01
    • 2015-01-13
    • 1970-01-01
    • 2011-02-07
    • 1970-01-01
    • 2011-11-28
    相关资源
    最近更新 更多