Android - 在网络中查找服务器

Posted

技术标签:

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

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

【问题讨论】:

【参考方案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 这是标准吗?

以上是关于Android - 在网络中查找服务器的主要内容,如果未能解决你的问题,请参考以下文章

从非 Android 设备查找和 Android NSD-Service

android总结

如何在 python 网络服务器中禁用反向 dns 查找?

Android:在应用程序被杀死后从小部件中查找服务是不是正在运行

查找服务的标准方法(在本地网络中打开端口)

客户端应用程序在 C# 中查找本地网络上的服务器的最佳方法是啥?