java udp 工具类_java基于UDP实现图片群发功能
UDP协议(用户数据报协议)是一种不可靠的网络协议,它在通信实例的两端各建立一个Socket,但是这两个Socket之间并没有虚拟链路,这两个Socket只是发送,接收数据报的对象。
UDP的优缺点:
1. 因为UDP协议是面向非连接的协议,没有建立连接的过程,因此它的通信效率很高。很适合一些即时性很强的应用场景。
2.因为在正式通信前不必与对方先连接,不管对方状态就直接发送,至于对方是否可以收到这些数据内容,UDP无法控制,所以说UDP是一种不可靠的协议。
3.传输大小限制在64KB以下,这个尤其要注意,在做这个实例的时候,因为没有考虑到这个,直接传了一张大图,结果找了半天的原因。
Java使用DatagramSocket代表UDP协议的Socket,它唯一的作用是接收和发送数据报,至于数据究竟发给谁,DatagramSocket并不清楚;具体发送的目的地是由DatagramPacket自身决定。当Client/Server程序使用UDP协议时,实际上并没有严格的服务器和客户端的区分。通常固定IP地址,固定端口的DatagramSocket对象所在程序被称为服务器,因为有固定的IP,端口地址,其他客户端的数据报可以直接发送到服务器上。
接收数据的DatagramPacket在实例化时无需指定端口和IP地址,给出数据数据的字节数组以及长度即可。然后调用DatagramSocket的receive()方法等待数据报的到来,该方法阻塞线程直到受到一个数据报为止。
发送数据的DatagramPacket不同的是,需要给出完整的目的地,包括IP地址和端口,这样数据报才能知道将数据发给谁。当服务器接收到一个DatagramPacket对象后,如果想向该数据报的发送者反馈一些消息,但由于UDP协议是面向非连接的,所以不知道数据报是谁发送过来的,但程序可以调用DatagramPacket的getAddress()(返回一个InetAddress对象,发报的IP地址),getPort()(返回发报的端口)和getSocketAddress()(返回一个SocketAddress对象,该对象可以同时代表IP地址和端口)。
实现思路:每个客户端启动时都会向服务端发送一个字符串,该字符串代表该客户端已经上线,并在服务端将每个客户端的发报地址(即SocketAddress对象)保存在一个Set集合中。当点击任意一个上线的客户端的发送图片按钮,该图片数据就会被发送到服务端上,服务端遍历SocketAddress集合,并将图片数据转发到每个SocketAddress对应的客户端上,就实现了简单的图片群发。具体代码如下:
客户端发送数据报的工具类:
public class DatagramUtil
{
public static final int BOADCAST_PORT = 8888;
public static final String DEST_IP = "192.168.1.101";
private static final int DATA_LEN = 50000;
//定义本程序私聊的Socket实例
private DatagramSocket singleSocket = null;
//定义接收网络数据的字符数组
byte[] inBuff = new byte[DATA_LEN];
private Handler handler;
//构造器,初始化资源
public DatagramUtil(Handler handler) throws Exception
{
this.handler = handler;
//创建用于私聊的DatagramSocket对象
singleSocket = new DatagramSocket();
new ReadSingle().start();
}
//定义单独用户发送消息的方法
public void sendSingle(byte[] msg)
{
try
{
DatagramPacket packet = new DatagramPacket(new byte[0] , 0 , InetAddress.getByName(DEST_IP) , BOADCAST_PORT);
packet.setData(msg);
singleSocket.send(packet);
}
catch (IOException e)
{
e.printStackTrace();
}
}
//不断地从DatagramSocket中读取数据的线程
class ReadSingle extends Thread
{
byte[] singleBuff = new byte[DATA_LEN];
private DatagramPacket singlePacket = new DatagramPacket(singleBuff , singleBuff.length);
@Override
public void run()
{
while (true)
{
// 读取Socket中的数据
try
{
//读取Socket中的数据
singleSocket.receive(singlePacket);
//处理得到的消息
Message msg = new Message();
msg.what = 0x123;
msg.obj = singleBuff;
handler.sendMessage(msg);
}
catch (IOException e)
{
e.printStackTrace();
if (singleSocket != null)
{
//关闭该Socket对象
singleSocket.close();
}
}
}
}
}
}
收到服务端发来的图片数据时,使用Handler更新UI。
public class MainActivity extends Activity
{
private Button button;
private ImageView img;
private DatagramUtil datagramUtil;
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);
button = (Button) findViewById(R.id.send_img_all);
img = (ImageView) findViewById(R.id.receiver_img);
try
{
datagramUtil = new DatagramUtil(handler);
sendData(stringYoByte());
}
catch (Exception e)
{
e.printStackTrace();
}
button.setOnClickListener(new View.OnClickListener()
{
@Override
public void onClick(View view)
{
sendData(bitMapToByte());
}
});
}
private void sendData(final byte[] msg)
{
new Thread()
{
@Override
public void run()
{
datagramUtil.sendSingle(msg);
}
}.start();
}
public byte[] bitMapToByte()
{
Bitmap bitmap = BitmapFactory.decodeResource(getResources() , R.drawable.wenqing);
ByteArrayOutputStream byteArray = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.PNG , 100 , byteArray);
bitmap.recycle();
return byteArray.toByteArray();
}
public byte[] stringYoByte()
{
String loginStr = "hello";
return loginStr.getBytes();
}
}
服务端代码(运行该Java程序即可):
public class UDPServer
{
public static final int PORT = 8888;
private static final int DATA_LEN = 50000;
byte[] inBuff = new byte[DATA_LEN];
private DatagramPacket inPacket = new DatagramPacket(inBuff , inBuff.length);
private DatagramPacket outPacket;
private DatagramSocket serverSocket;
private Set socketAddressList = Collections.synchronizedSet(new HashSet());
public void init() throws IOException
{
serverSocket = new DatagramSocket(PORT);
while (true)
{
serverSocket.receive(inPacket);
String result = new String(inBuff , 0 , inBuff.length);
if (result.trim().equals("hello"))
{
socketAddressList.add(inPacket.getSocketAddress());
}
else
{
for (Iterator iterator = socketAddressList.iterator(); iterator.hasNext() ; )
{
SocketAddress socketAddress = iterator.next();
outPacket = new DatagramPacket(inBuff , inBuff.length , socketAddress);
serverSocket.send(outPacket);
}
}
}
}
public static void main(String[] args) throws IOException
{
new UDPServer().init();
}
}
这样实现了简单的图片群发的效果。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
java udp 工具类_java基于UDP实现图片群发功能相关推荐
- java pdf工具类_Java PDF工具类(一)| 使用 itextpdf 根据PDF模板生成PDF(文字和图片)...
Java PDF工具类(一)| 使用 itextpdf 根据设置好的PDF模板填充PDF(文字和图片) 相关文章: Java PDF工具类(二)| 使用 wkhtmltox 实现 HTML转PDF(文 ...
- java udp 聊天室_Java基于UDP协议实现简单的聊天室程序
最近比较闲,一直在抽空回顾一些Java方面的技术应用. 今天没什么事做,基于UDP协议,写了一个非常简单的聊天室程序. 现在的工作,很少用到socket,也算是对Java网络编程方面的一个简单回忆. ...
- java 图片合成 工具类_Java实现的微信图片处理工具类【裁剪,合并,等比例缩放等】...
本文实例讲述了Java实现的微信图片处理工具类.分享给大家供大家参考,具体如下: 现在 外面核心,图片文章比较少,看了拷贝代码,而用不了,用相应jar包处理,很多等比例缩放,达不到 想要的给予的期望: ...
- java 解压缩 工具类_Java实现的zip压缩及解压缩工具类示例
本文实例讲述了Java实现的zip压缩及解压缩工具类.分享给大家供大家参考,具体如下: import java.io.BufferedInputStream; import java.io.Buffe ...
- java常用工具类_java(二):工作中常用到的工具类
工作中大家要用到很多工具类,第三方的jar中有很多现成的工具类符合自己的项目需要,这个时候就不需要去重复造轮子了,从而节省了很多时间,大家可以利用这些时间去做其它重要的事情,如果没有符合自己的工具类, ...
- java 加减乘除 工具类_Java数学工具类MathUtil详解
package cn.xbz.util.math; import java.math.BigDecimal; /** * @title 数学计算工具类 * @description 提供常用的数值加减 ...
- java cron工具类_Java工具类之:包装类
我们都知道,JDK 其实给我们提供了很多很多 Java 开发者已经写好的现成的类,他们其实都可以理解成工具类,比如我们常见的集合类,日期相关的类,数学相关的类等等,有了这些工具类,你会发现它能很大程度 ...
- java json 工具类_Java中JSON处理工具类使用详解
本文实例为大家分享了JSON处理工具类的具体代码,供大家参考,具体内容如下 import java.io.IOException; import java.util.Date; import java ...
- java aes 工具类_Java中的AES加解密工具类:AESUtils
本人手写已测试,大家可以参考使用 package com.mirana.frame.utils.encrypt; import com.mirana.frame.constants.SysConsta ...
最新文章
- 在Intellij IDEA中运行Vaadin应用
- 【转载记录】Accessing Device Drivers from C#
- 操作系统学习总结(超赞!!!)
- 波士顿动力机器狗解锁“自动驾驶”,会跑步的Atlas真的很稳
- IM系统中聊天记录模块的设计与实现
- matlab给图像加云,matlab怎么给图像加雾
- pip换源及指令的使用
- Windows 10 下载官方正版ISO镜像文件
- h3c服务器通过pxe安装系统,h3c服务器设置pxe启动
- 外贸软件进口供应链管理解决方案
- 盗墓笔记—阿里旺旺ActiveX控件imageMan.dll栈溢出漏洞研究
- 【XLPNet车牌识别算法】第一章 序
- java耗时操作_耗时操作方案总结
- XTP Python Api 接口编译
- 三维重建——孔洞填补算法
- linux的cut命令详解
- JavaScript基本原理常识
- UBUNTU无ROOT权限解决“Could not resolve hostname XXXXX: Name or service not known“问题
- IOS将GPS定位经纬度转换为高德地图经纬度
- PYTHON:PYQT5 实现 pdf 合并与分割