您的位置:首页 > 移动开发 > Android开发

android MulticastLock

2016-02-21 10:21 429 查看
转载出处:http://blog.csdn.net/hknock/article/details/44244031

MulticastSocket API说明http://www.apihome.cn/api/java/MulticastSocket.html

Android的Wifi,默认情况下是不接受组播的,见:http://developer.android.com/reference/android/net/wifi/WifiManager.MulticastLock.html

默认情况下,应用是不接收组播信息的,这样要接收处理的报文太多,很快就会把电池用尽。要知道移动设备(特指电话一类的,平板要好得多)目前最重要的因素是电量。

要想打开组播功能,有以下几个步骤:

在Manifest文件中加入:android.permission.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) {

super.onCreate(savedInstanceState);

setContentView(R.layout.main);

allowMulticast();

try {

NetUtil.findServerIpAddress();

} catch (IOException e) {

throw new RuntimeException(e);

}

Log.d("multicast.demo", "find ip ok.");

multicastLock.release();

}

private void allowMulticast(){

WifiManager wifiManager=(WifiManager)getSystemService(Context.WIFI_SERVICE);

multicastLock=wifiManager.createMulticastLock("multicast.test");

multicastLock.acquire();

}

}

在Activity中打开和释放组播锁。

使用组播发送报文和接收ip地址信息的工具类代码

public class NetUtil {

private static final String TAG="Net.Utils";

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

multicastSocket.setLoopbackMode(true);

InetAddress group = InetAddress.getByName(GROUP_IP);

multicastSocket.joinGroup(group);

DatagramPacket packet=new DatagramPacket(sendData, sendData.length,group,MULTICAST_PORT);

for(;;){

multicastSocket.send(packet);

Log.d(TAG,">>>send packet ok");

byte[] receiveData=new byte[256];

packet=new DatagramPacket(receiveData, receiveData.length);

multicastSocket.receive(packet);

String packetIpAddress=packet.getAddress().toString();

packetIpAddress=packetIpAddress.substring(1, packetIpAddress.length());

Log.d(TAG,"packet ip address: "+packetIpAddress);

StringBuilder packetContent=new StringBuilder();

for(int i=0;i<receiveData.length;i++){

if(receiveData[i]==0){

break;

}

packetContent.append((char)receiveData[i]);

}

ip=packetContent.toString();

Log.d(TAG,"packet content ip is: "+ip);

if(ip.equals(packetIpAddress)){

Log.d(TAG,"find server ip address: "+ip);

break;

}else{

Log.d(TAG,"not find server ip address, continue …");

try {

Thread.sleep(1000);

} catch (InterruptedException e) {

}

}

}

return ip;

}

}

转自: http://marshal.easymorse.com/archives/4461
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息