【发布时间】:2011-05-26 17:44:24
【问题描述】:
我目前正在编写一个客户端-服务器应用程序,我问自己是否有更好的方法在本地网络中找到服务器,然后遍历所有可用的 IP 地址并查看是否提供了正确的答案?
【问题讨论】:
标签: android networking network-programming
我目前正在编写一个客户端-服务器应用程序,我问自己是否有更好的方法在本地网络中找到服务器,然后遍历所有可用的 IP 地址并查看是否提供了正确的答案?
【问题讨论】:
标签: android networking network-programming
您可能想要查看 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);
}
构建广播地址后,一切正常。以下代码将通过广播发送字符串数据,然后等待响应:
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 上运行。
【讨论】:
socket.receive(packet); 返回的数据包与发送的数据包完全相同。似乎它甚至没有等待来自服务器的应答数据包,而是返回了相同的数据。
/255.255.255.255 这是标准吗?