Android使用MulticastSocket实现多点广播图片
DatagramSocket只允许数据报发送给指定的目标地址,而MulticastSocket可以将数据报以广播的方式发送至多个客户端。其主要思想是设置一组特殊网络地址作为多点广播地址,每个多点广播地址都被看做一个组,当客户端需要发送,接收广播消息时,加入到该组即可。
IP协议为多点广播提供了这些特殊的IP地址,这些IP地址的范围是224.0.0.0至239.255.255.255。当MulticastSocket把一个DatagramPacket发送到多点广播IP地址时,该数据将被自动广播到加入该地址的所有MulticastSocket,同时也可以设置该MulticastSocket接收自身发送的数据。
如果仅仅是用于发送数据报的MulticastSocket对象,使用默认地址,随机端口即可。但如果创建接收用的MulticastSocket对象,则该MulticastSocket对象必须指定端口,否则发送方无法确定发送数据报的目标端口。
下面通过一个简单的例子实现多点广播图片:
多点广播的工具类:
publicclassComUtil { publicstaticfinalStringBROADCAST_IP="224.2.2.2"; publicstaticfinalintBOADCAST_PORT=30000; privatestaticfinalintDATA_LEN=100*1024; //定义本程序的MulticastSocket实例 privateMulticastSocketsocket=null; //定义广播的IP地址 privateInetAddressbroadcastAddress=null; //定义接收网络数据的字符数组 byte[]inBuff=newbyte[DATA_LEN]; //以指定字节数组创建准备接受的DatagramPacket对象 privateDatagramPacketinPacket=newDatagramPacket(inBuff,inBuff.length); //定义一个用于发送的DatagramPacket对象 privateDatagramPacketoutPacket=null; privateHandlerhandler; //构造器,初始化资源 publicComUtil(Handlerhandler)throwsException { this.handler=handler; //因为该MultcastSocket对象需要接受数据,所以有指定端口 socket=newMulticastSocket(BOADCAST_PORT); broadcastAddress=InetAddress.getByName(BROADCAST_IP); //将该socket加入指定的多点广播地址 socket.joinGroup(broadcastAddress); //设置本MultcastSocket发送的数据报将被送到本身 socket.setLoopbackMode(false); //初始化发送用的DatagramSocket,它包含一个长度为0的字节数组 outPacket=newDatagramPacket(newbyte[0],0,broadcastAddress,BOADCAST_PORT); newReadBroad().start(); } //广播消息的工具方法 publicvoidbroadCast(byte[]msg) { try { //将msg字符串转换为字节数组 byte[]buff=msg; //设置发送用的DatagramPacket里的字节数组 outPacket.setData(buff); //发送数据 socket.send(outPacket); } catch(IOExceptione) { e.printStackTrace(); } } //持续读取MulticastSocket的线程 classReadBroadextendsThread { publicvoidrun() { while(true) { try { //读取Socket中的数据 socket.receive(inPacket); Messagemsg=newMessage(); msg.what=0x123; msg.obj=inBuff; handler.sendMessage(msg); } catch(IOExceptione) { e.printStackTrace(); } } } } }
MainActivity类:
publicclassMainActivityextendsActivity { privateButtonbutton; privateImageViewimg; privateComUtilcomUitl; Handlerhandler=newHandler() { @Override publicvoidhandleMessage(Messagemsg) { if(msg.what==0x123) { byte[]result=(byte[])msg.obj; img.setImageBitmap(BitmapFactory.decodeByteArray(result,0,result.length)); } } }; @Override protectedvoidonCreate(BundlesavedInstanceState) { super.onCreate(savedInstanceState); setContentView(R.layout.main_activity); try { comUitl=newComUtil(handler); } catch(Exceptione) { e.printStackTrace(); } button=(Button)findViewById(R.id.send_img_all); img=(ImageView)findViewById(R.id.receiver_img); button.setOnClickListener(newView.OnClickListener() { @Override publicvoidonClick(Viewview) { sendData(); } }); } privatevoidsendData() { Bitmapbitmap=BitmapFactory.decodeResource(getResources(),R.drawable.wenqing2); ByteArrayOutputStreambyteArray=newByteArrayOutputStream(); bitmap.compress(Bitmap.CompressFormat.PNG,100,byteArray); bitmap.recycle(); finalbyte[]msg=byteArray.toByteArray(); newThread() { @Override publicvoidrun() { comUitl.broadCast(msg); } }.start(); try { byteArray.close(); } catch(IOExceptione) { e.printStackTrace(); } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持毛票票。