Android使用MulticastSocket实现多点广播图片
程序员文章站
2022-07-04 09:46:03
datagramsocket只允许数据报发送给指定的目标地址,而multicastsocket可以将数据报以广播的方式发送至多个客户端。其主要思想是设置一组特殊网络地址作为...
datagramsocket只允许数据报发送给指定的目标地址,而multicastsocket可以将数据报以广播的方式发送至多个客户端。其主要思想是设置一组特殊网络地址作为多点广播地址,每个多点广播地址都被看做一个组,当客户端需要发送,接收广播消息时,加入到该组即可。
ip协议为多点广播提供了这些特殊的ip地址,这些ip地址的范围是224.0.0.0至239.255.255.255。当multicastsocket把一个datagrampacket发送到多点广播ip地址时,该数据将被自动广播到加入该地址的所有multicastsocket,同时也可以设置该multicastsocket接收自身发送的数据。
如果仅仅是用于发送数据报的multicastsocket对象,使用默认地址,随机端口即可。但如果创建接收用的multicastsocket对象,则该multicastsocket对象必须指定端口,否则发送方无法确定发送数据报的目标端口。
下面通过一个简单的例子实现多点广播图片:
多点广播的工具类:
public class comutil { public static final string broadcast_ip = "224.2.2.2"; public static final int boadcast_port = 30000; private static final int data_len = 100 * 1024; //定义本程序的multicastsocket实例 private multicastsocket socket = null; //定义广播的ip地址 private inetaddress broadcastaddress = null; //定义接收网络数据的字符数组 byte[] inbuff = new byte[data_len]; //以指定字节数组创建准备接受的datagrampacket对象 private datagrampacket inpacket = new datagrampacket(inbuff , inbuff.length); //定义一个用于发送的datagrampacket对象 private datagrampacket outpacket = null; private handler handler; //构造器,初始化资源 public comutil(handler handler) throws exception { this.handler = handler; //因为该multcastsocket对象需要接受数据,所以有指定端口 socket = new multicastsocket(boadcast_port); broadcastaddress = inetaddress.getbyname(broadcast_ip); //将该socket加入指定的多点广播地址 socket.joingroup(broadcastaddress); //设置本multcastsocket发送的数据报将被送到本身 socket.setloopbackmode(false); //初始化发送用的datagramsocket,它包含一个长度为0的字节数组 outpacket = new datagrampacket(new byte[0] , 0 , broadcastaddress , boadcast_port); new readbroad().start(); } //广播消息的工具方法 public void broadcast(byte[] msg) { try { //将msg字符串转换为字节数组 byte[] buff = msg; //设置发送用的datagrampacket里的字节数组 outpacket.setdata(buff); //发送数据 socket.send(outpacket); } catch (ioexception e) { e.printstacktrace(); } } //持续读取multicastsocket的线程 class readbroad extends thread { public void run() { while (true) { try { //读取socket中的数据 socket.receive(inpacket); message msg = new message(); msg.what = 0x123; msg.obj = inbuff; handler.sendmessage(msg); } catch (ioexception e) { e.printstacktrace(); } } } } }
mainactivity类:
public class mainactivity extends activity { private button button; private imageview img; private comutil comuitl; handler handler = new handler() { @override public void handlemessage(message msg) { if (msg.what == 0x123) { byte[] result = (byte[]) msg.obj; img.setimagebitmap(bitmapfactory.decodebytearray(result , 0 , result.length)); } } }; @override protected void oncreate(bundle savedinstancestate) { super.oncreate(savedinstancestate); setcontentview(r.layout.main_activity); try { comuitl = new comutil(handler); } catch (exception e) { e.printstacktrace(); } button = (button) findviewbyid(r.id.send_img_all); img = (imageview) findviewbyid(r.id.receiver_img); button.setonclicklistener(new view.onclicklistener() { @override public void onclick(view view) { senddata(); } }); } private void senddata() { bitmap bitmap = bitmapfactory.decoderesource(getresources() , r.drawable.wenqing2); bytearrayoutputstream bytearray = new bytearrayoutputstream(); bitmap.compress(bitmap.compressformat.png , 100 , bytearray); bitmap.recycle(); final byte[] msg = bytearray.tobytearray(); new thread() { @override public void run() { comuitl.broadcast(msg); } }.start(); try { bytearray.close(); } catch (ioexception e) { e.printstacktrace(); } } }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持。
上一篇: 专家解密 风光摄影的基本器材
下一篇: 遵义端午节去哪里玩好 遵义端午旅游好去处
推荐阅读
-
Android使用Recyclerview实现图片水平自动循环滚动效果
-
Android框架Volley使用:ImageRequest请求实现图片加载
-
Android使用ViewPager实现图片滑动预览效果
-
Android使用ViewFlipper实现图片切换功能
-
android 多点触摸图片缩放的具体实现方法
-
Android 使用viewpager实现画廊式效果(展示图片)
-
Android中使用SeekBar拖动条实现改变图片透明度
-
Android多点触控技术,实现对图片的放大缩小平移,惯性滑动等功能
-
Android自定义ImageView实现图片缩放滑动,双击放大缩小,多点触控旋转,圆角矩形,圆形和仿刮刮卡效果
-
使用Java代码在Android中实现图片裁剪功能