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

更多相关文章

  1. Android(安卓)IPC机制——Binder详解
  2. 详解 Android(安卓)的 Activity 组件
  3. android设置软键盘搜索键以及监听搜索键点击事件
  4. Android(安卓)内存溢出解决方案(OOM) 整理总结
  5. android中的sqlite数据库加密
  6. android内存分析工具- MAT的初识(1)
  7. Android(安卓)使用Parcelable序列化对象
  8. RxAndroid(安卓)教程
  9. Android窗口系统第三篇---WindowManagerService中窗口的组织方式

随机推荐

  1. android-环境
  2. android 自定义TextView实现秒级数字时钟
  3. Android之自定义适配器
  4. android 生成密钥 签名
  5. mono for android Main.axml
  6. Error: Could not find gradle wrapper w
  7. android developers api guides 文档学习
  8. android api
  9. 在android应用市场中直接定位到自己的应
  10. Android 去除头部标题栏