StupidBeauty
Read times:1331Posted at: - no title specified

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 );

}

发送及接收UDP广播数据包

构造好了广播地址之后,事情就变得简单了。以下代码会通过广播来发送字符串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);

Your opinions

Your name:Email:Website url:Opinion content: