android如何设置多条广播,Android使用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如何设置多条广播,Android使用MulticastSocket实现多点广播图片相关推荐
- android 微信设置圆角边框代码,Android编程实现圆角边框的方法
本文实例讲述了Android编程实现圆角边框的方法.分享给大家供大家参考,具体如下: 设置边框圆角可以在drawable-mdpi目录里定义一个xml: android:topRightRadius= ...
- android webview 设置cookie时间,解决Android webview设置cookie和cookie丢失的问题
Android页面嵌套了一个h5,H5页面内部有用户登陆页面,发现h5页面的登陆功能无法使用,一直登陆失败.和web那边商量一会,发现js写入的cookie丢失了.所有需要Android这边在重写写入 ...
- android 铃声设置失败,无法通过Android代码设置铃声
我正在开发一个应用程序,它将随机设置用户已选择的铃声列表中的铃声.无法通过Android代码设置铃声 虽然我的代码适用于Android N及以上版本,但我遇到了Android M及以下版本的问题.我为 ...
- android edittext设置多行,在Android的EditText视图中允许多行?
在Android的EditText视图中允许多行? 如何在Android的EditText视图中允许多行? 12个解决方案 981 votes 默认情况下,Android中的所有EditText小部件 ...
- android动态设置maxWidth,如何使用android:maxWidth?
I want to set a maximum width of an edit box. 在你的例子中: android:layout_width="fill_parent" a ...
- android 动态设置style属性值,android中的style属性值,以及一些预定义样式
Android平台定义的主题样式:android:theme="@android:style/Theme.Dialog" // 将一个Activity显示为对话框模式 androi ...
- android实现渐变进度条,自定义Android进度条ProgressBar颜色的渐变设置
1.在drawable文件夹中新建my_progressbar.xml文件android android:endColor="@color/c_e5e5e5" android:st ...
- android notification设置不同字体颜色,Android Notification自定义通知样式你要知道的事...
本文将根据个人经验对Notification做个总结,以供参考! 什么是通知(Notification) 通知是一个可以在应用程序正常的用户界面之外显示给用户的消息. 通知发出时,它首先出现在状态栏的 ...
- Android中设置字体居中,【Android】TextView中不同大小字体如何上下垂直居中?
前言 在客户端开发中,我们往往需要对一个TextView的文字的部分内容进行特殊化处理,比如加粗.改变颜色.加链接.下划线等.iOS为我们提供了AttributedString,而Android则提供 ...
最新文章
- 比特币现金对穷人更友善
- 3.3V稳压IC芯片 1117-3.3V性能测试
- B站焊武帝爆火出圈:纯手工拼晶体管自制CPU,耗时半年,可跑程序
- python os.system 不打印_Python初体验之我爱你
- c++中delete对象后 调用成员函数_C++类的特殊成员函数及default/delete特性
- 任正非:我若贪生怕死,何来让你们去英勇奋斗
- kubevela随笔
- 3.cocos2dx它Menu,由menu为了实现场景切换
- 网易严选Java开发三面面经:java技术编程培训班
- django-动漫节目列表,后台的操作
- PyTorch 1.8版本!正式支持AMD GPU
- 1 源码安装Zabbix agent 3.4
- 多位数据库专拣点评这本书
- 奇怪的信 c语言 整数位数为偶数求和
- maya 白天室内灯光_MAYA室内灯光之灯管的设置技巧
- 手机能打开的表白代码_不是程序员都能学会的5个表白代码,一学就会,附源码...
- 想了解能源互联网?看这篇就够了
- 【毕业设计】基于大数据的电影数据爬取分析可视化系统
- python 方差_python+方差_python 方差_python 方差齐性检验 - 云+社区 - 腾讯云
- 微信公众号最佳实践 ( 7.5 )股票行情及分析