【问题标题】:Android - find a server in the networkAndroid - 在网络中查找服务器
【发布时间】:2011-05-26 17:44:24
【问题描述】:

我目前正在编写一个客户端-服务器应用程序,我问自己是否有更好的方法在本地网络中找到服务器,然后遍历所有可用的 IP 地址并查看是否提供了正确的答案?

【问题讨论】:

    标签: android networking network-programming


    【解决方案1】:

    您可能想要查看 UDP 广播,您的服务器会在其中宣布自己并且手机会侦听广播。


    There is an example 来自 Boxee 远程项目,引用如下。

    获取广播地址

    您需要访问 wifi 管理器以获取 DHCP 信息并从中构造广播地址:

    InetAddress getBroadcastAddress() throws IOException {
        WifiManager wifi = mContext.getSystemService(Context.WIFI_SERVICE);
        DhcpInfo dhcp = wifi.getDhcpInfo();
        // handle null somehow
    
        int broadcast = (dhcp.ipAddress & dhcp.netmask) | ~dhcp.netmask;
        byte[] quads = new byte[4];
        for (int k = 0; k < 4; k++)
          quads[k] = (byte) ((broadcast >> k * 8) & 0xFF);
        return InetAddress.getByAddress(quads);
    }
    

    发送和接收 UDP 广播包

    构建广播地址后,一切正常。以下代码将通过广播发送字符串数据,然后等待响应:

    DatagramSocket socket = new DatagramSocket(PORT);
    socket.setBroadcast(true);
    DatagramPacket packet = new DatagramPacket(data.getBytes(), data.length(),
        getBroadcastAddress(), DISCOVERY_PORT);
    socket.send(packet);
    
    byte[] buf = new byte[1024];
    DatagramPacket packet = new DatagramPacket(buf, buf.length);
    socket.receive(packet);
    

    您也可以查看 Bonjour/zeroconf,有一个 Java implementation 应该可以在 Android 上运行。

    【讨论】:

    • 谢谢!这就是我要找的。​​span>
    • @mark:成功了吗? They 说,并非所有安卓设备都能正确处理非单播流量。以我为例,socket.receive(packet); 返回的数据包与发送的数据包完全相同。似乎它甚至没有等待来自服务器的应答数据包,而是返回了相同的数据。
    • 我的应用程序中有这样的 UDP 发现,大约 1%-3% 的用户声称找不到服务器。这是因为某些路由器会阻止 UDP 广播。我将另外使用 IP 扫描和/或 Bonjour。
    • 我得到/255.255.255.255 这是标准吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-10-10
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    相关资源
    最近更新 更多