在Manifest文件中加入:.CHANGE_WIFI_MULTICAST_STATE,这个权限
获取到MulticastLock对象,这个对象不能直接实例化,要通过WifiManager间接得到,工厂模式
调用MulticastLock对象的acquire方法,获取到组播锁
相应的,用完组播,为了不浪费电力,要调用MulticastLock的release方法释放锁
下面写了个简单示例,通过组播发现服务器。
Activity写的比较简单
public class MulticastDemoActivity extends Activity {
MulticastLock multicastLock;
/** Called when the activity is first created. */
@Override
public void onCreate(Bundle savedInstanceState) {
(savedInstanceState);
setContentView();
allowMulticast();
try {
();
} catch (IOException e) {
throw new RuntimeException(e);
}
("", "find ip ok.");
();
}
private void allowMulticast(){
WifiManager wifiManager=(WifiManager)getSystemService(Context.WIFI_SERVICE);
multicastLock=("");
();
}
}
在Activity中打开和释放组播锁。使用组播发送报文和接收ip地址信息的工具类代码:
public class NetUtil {
private static final String TAG="";
private static final int MULTICAST_PORT=5111;
private static final String GROUP_IP="224.5.0.7";
private static byte[] sendData;
static{
sendData=new byte[4];
// 0xEE78F1FB
sendData[3] = (byte) 0xEE;
sendData[2] = (byte) 0×78;
sendData[1] = (byte) 0xF1;
sendData[0] = (byte) 0xFB;
}
public static String findServerIpAddress() throws IOException{
String ip=null;
MulticastSocket multicastSocket=new MulticastSocket(MULTICAST_PORT);
(true);
InetAddress group = (GROUP_IP);
(group);
DatagramPacket packet=new DatagramPacket(sendData, ,group,MULTICAST_PORT);
for(;;){
(packet);
(TAG,">>>send packet ok");
byte[] receiveData=new byte[256];
packet=new DatagramPacket(receiveData, );
(packet);
String packetIpAddress=().toString();
packetIpAddress=(1, ());
(TAG,"packet ip address: "+packetIpAddress);
StringBuilder packetContent=new StringBuilder();
for(int i=0;i<;i++){
if(receiveData[i]==0){
break;
}
((char)receiveData[i]);
}
ip=();
(TAG,"packet content ip is: "+ip);
if((packetIpAddress)){
(TAG,"find server ip address: "+ip);
break;
}else{
(TAG,"not find server ip address, continue …");
try {
(1000);
} catch (InterruptedException e) {
}
}
}
return ip;
}
}