boxeeremote维基文档翻译: AndroidUDP
在安卓系统中发送及接收UDP 广播数据包
我花掉了狠长的时间才弄清楚如何在安卓系统中发送及接收UDP 广播数据包。此文档就是说明这个的,以避免其他人又恨不得到墙上撞死。
在我的例子当中,我需要在2562 端口上发送广播数据包,因为,Boxee就是在那个端口上监听的,收到数据包之后会回复一个UDP 数据包以宣告自己的存在。这是我用来发现boxee的方法。
这个项目中包含着一些使用 UDP 广播的安卓代码,但是其中带有一些无关的代码,因此我在此文档中解释一下其中最重要的技术细节。
有一点需要注意,向移动网络中发送广播数据包会失败,所以,妳应当只向无线網络发送广播数据包。由于安卓模拟器不支持无线網,所以,妳需要在真机上测试。
妳需要访问无线網管理器,以获取到DHCP 信息,并且根据这个信息来构造一个广播地址:
InetAddress getBroadcastAddress() throws IOException {
WifiManager wifi = mContext . getSystemService ( Context . WIFI_SERVICE );
DhcpInfo dhcp = wifi . getDhcpInfo ();
// 记得处理 空指针(null)
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 );
}
构造好了广播地址之后,事情就变得简单了。以下代码会通过广播来发送字符串data,然后等待回复:
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);
HxLauncher: Launch Android applications by voice commands