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