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如何设置多条广播,Android使用MulticastSocket实现多点广播图片相关推荐

  1. android 微信设置圆角边框代码,Android编程实现圆角边框的方法

    本文实例讲述了Android编程实现圆角边框的方法.分享给大家供大家参考,具体如下: 设置边框圆角可以在drawable-mdpi目录里定义一个xml: android:topRightRadius= ...

  2. android webview 设置cookie时间,解决Android webview设置cookie和cookie丢失的问题

    Android页面嵌套了一个h5,H5页面内部有用户登陆页面,发现h5页面的登陆功能无法使用,一直登陆失败.和web那边商量一会,发现js写入的cookie丢失了.所有需要Android这边在重写写入 ...

  3. android 铃声设置失败,无法通过Android代码设置铃声

    我正在开发一个应用程序,它将随机设置用户已选择的铃声列表中的铃声.无法通过Android代码设置铃声 虽然我的代码适用于Android N及以上版本,但我遇到了Android M及以下版本的问题.我为 ...

  4. android edittext设置多行,在Android的EditText视图中允许多行?

    在Android的EditText视图中允许多行? 如何在Android的EditText视图中允许多行? 12个解决方案 981 votes 默认情况下,Android中的所有EditText小部件 ...

  5. android动态设置maxWidth,如何使用android:maxWidth?

    I want to set a maximum width of an edit box. 在你的例子中: android:layout_width="fill_parent" a ...

  6. android 动态设置style属性值,android中的style属性值,以及一些预定义样式

    Android平台定义的主题样式:android:theme="@android:style/Theme.Dialog" // 将一个Activity显示为对话框模式 androi ...

  7. android实现渐变进度条,自定义Android进度条ProgressBar颜色的渐变设置

    1.在drawable文件夹中新建my_progressbar.xml文件android android:endColor="@color/c_e5e5e5" android:st ...

  8. android notification设置不同字体颜色,Android Notification自定义通知样式你要知道的事...

    本文将根据个人经验对Notification做个总结,以供参考! 什么是通知(Notification) 通知是一个可以在应用程序正常的用户界面之外显示给用户的消息. 通知发出时,它首先出现在状态栏的 ...

  9. Android中设置字体居中,【Android】TextView中不同大小字体如何上下垂直居中?

    前言 在客户端开发中,我们往往需要对一个TextView的文字的部分内容进行特殊化处理,比如加粗.改变颜色.加链接.下划线等.iOS为我们提供了AttributedString,而Android则提供 ...

最新文章

  1. 比特币现金对穷人更友善
  2. 3.3V稳压IC芯片 1117-3.3V性能测试
  3. B站焊武帝爆火出圈:纯手工拼晶体管自制CPU,耗时半年,可跑程序
  4. python os.system 不打印_Python初体验之我爱你
  5. c++中delete对象后 调用成员函数_C++类的特殊成员函数及default/delete特性
  6. 任正非:我若贪生怕死,何来让你们去英勇奋斗
  7. kubevela随笔
  8. 3.cocos2dx它Menu,由menu为了实现场景切换
  9. 网易严选Java开发三面面经:java技术编程培训班
  10. django-动漫节目列表,后台的操作
  11. PyTorch 1.8版本!正式支持AMD GPU
  12. 1 源码安装Zabbix agent 3.4
  13. 多位数据库专拣点评这本书
  14. 奇怪的信 c语言 整数位数为偶数求和
  15. maya 白天室内灯光_MAYA室内灯光之灯管的设置技巧
  16. 手机能打开的表白代码_不是程序员都能学会的5个表白代码,一学就会,附源码...
  17. 想了解能源互联网?看这篇就够了
  18. 【毕业设计】基于大数据的电影数据爬取分析可视化系统
  19. python 方差_python+方差_python 方差_python 方差齐性检验 - 云+社区 - 腾讯云
  20. 微信公众号最佳实践 ( 7.5 )股票行情及分析

热门文章

  1. 有向无环图的拓扑排序
  2. arm下如何烧写指定分区大小的内核和文件系统
  3. 列表刷新+SBJSON+HTTP
  4. POJ 3481 Double Queue
  5. LSMW、BDC、CATT 区别
  6. PO增强,明细动抬头动
  7. 致远协同软件手机版让移动办公不再是梦想
  8. SAP PP常用表(重要)
  9. SAP CO Report
  10. 这款国产BI我推荐了:Tableau+SPSS+python的综合集成