011-十一、网络编程之网络编程-UDP
引言
UDP
是 User Datagram Protocol
的简称, 中文名是用户数据报协议,是 OSI
(Open System Interconnection
,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF
RFC
768
是 UDP
的正式规范。UDP
在 IP
报文的协议号是 17
。
在选择使用协议的时候,选择 UDP
必须要谨慎。在网络质量令人十分不满意的环境下,UDP
协议数据包丢失会比较严重。
但是由于 UDP
的特性:它不属于连接型协议,因而具有资源消耗小,处理速度快的优点,所以通常音频、视频和普通数据在传送时使用 UDP
较多,因为它们即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。比如我们聊天用的ICQ和QQ就是使用的 UDP
协议
以上都是百度百科解释
总结一句:UDP
是用户数据报协议的缩写,一个无连接的协议。提供了应用程序之间要发送的数据的数据包。
UDP应用场景主要有
(1)面向数据报方式;
(2)网络数据大多为短消息;
(3)拥有大量Client
;
(4)对数据安全性无特殊要求;
(5)网络负担非常重,但对响应速度要求高。
UDP网络编程简单使用
udp
的服务端的编写步骤
创建 DatagramSocket
类的套接字,并且设置服务端的端口
创建接收客户端传过来的书籍的容器
使用 DatagramPacket
将容器打包
接收数据
分析数据
关闭资源
udp
的客户端的编写步骤
创建 DatagramSocket
类的套接字,并且设置客户端的端口
准备要发送的数据以 byte[]
格式
使用 DatagramPacket
将数据打包
发送数据
关闭资源
下面我们编写一个字符串传输和一个 list
数组传输的例子吧
udp字符串传输例子
按照上面 udp
的服务端和客户端的步骤编写字符串传输的例子
服务端代码
public class UDPServer {
public static void main(String[] args) throws IOException {
/**
udp的服务端的编写步骤
1.创建DatagramSocket类的套接字,并且设置服务端的端口
2.创建接收客户端传过来的书籍的容器
3.使用DatagramPacket将容器打包
4.接收数据
5.分析数据
6.关闭资源
*/
//创建DatagramSocket类的套接字,并且设置服务端的端口
DatagramSocket server = new DatagramSocket(10000);
//创建接收客户端传过来的书籍的容器
byte[] bytes = new byte[1024];
//使用DatagramPacket将容器打包
DatagramPacket packet = new DatagramPacket(bytes,bytes.length);
//接收数据
server.receive(packet);
//分析数据
byte[] data = packet.getData();
int len = packet.getLength();
server.close();
System.out.println(new String(data,0,len));
}
}
//客户端代码
public class UDPClient {
public static void main(String[] args) throws IOException {
/**
udp的客户端的编写步骤
1.创建DatagramSocket类的套接字,并且设置客户端的端口
2.准备要发送的数据以byte[]格式
3.使用DatagramPacket将数据打包
4.发送数据
5.关闭资源
*/
//创建DatagramSocket类的套接字,并且设置客户端的端口
DatagramSocket client = new DatagramSocket(20000);
//准备要发送的数据以byte[]格式
byte[] data = "我是client".getBytes();
//使用DatagramPacket将数据打包
DatagramPacket packet = new DatagramPacket(
data,data.length, InetAddress.getLocalHost(),//本地ip
10000 //服务器的端口
);
//发送数据
client.send(packet);
//关闭资源
client.close();
}
}
输出结果:
我是client
这就是最简单的 udp
传输的例子
udp对象传输例子
对象传输只需要将传输的字符串改成对象即可,这里我们使用 list
集合吧!
由于网络传输都是使用byte[]
,所以这个时候我们需要新增一个将 list
集合转成byte[]
数组的方法。在改造当中需要使用到io
当中的4
个类
ByteArrayOutputStream、ByteArrayInputStream
ObjectOutputStream、ObjectInputStream
注意使用ObjectOutputStream、ObjectInputStream2
个类一定要将类序列化就是要继承
Serializable
接口
客户端改造
1、创建一个 Car
类属性有名称和价格
2、在 UDPClient
类中增加一个 setData
方法,返回值为byte[]
Car类代码
public class Car implements Serializable {
private String name;
private double price;
public Car(String name, double price) {
this.name = name;
this.price = price;
}
@Override
public String toString() {
return "Car{" +
"name='" + name + '\'' +
", price=" + price +
'}'+"\r\n";
}
}
etData方法代码
private static byte[] setData() throws IOException {
List<Car> carList = new ArrayList<>();
carList.add(new Car("奔驰",10000.00));
carList.add(new Car("宝马",20000.00));
carList.add(new Car("凯迪拉克",30000.00));
carList.add(new Car("雷克萨斯",40000.00));
//使用io中的ByteArrayOutputStream,ObjectOutputStream,将list集合转换为byte数组
ByteArrayOutputStream outByteArray = new ByteArrayOutputStream();
ObjectOutputStream out = new ObjectOutputStream(outByteArray);
out.writeObject(carList);
byte[] bytes = outByteArray.toByteArray();
out.close();
outByteArray.close();
return bytes;
}
服务端改造
在UDPServer类中增加一个getData方法,返回值为List集合
private static List<Car> getData(byte[] data,int len) throws IOException, ClassNotFoundException {
ByteArrayInputStream inByteArray = new ByteArrayInputStream(data,0,len);
ObjectInputStream in = new ObjectInputStream(inByteArray);
List<Car> carList = (List<Car>) in.readObject();
in.close();
inByteArray.close();
return carList;
}
输出结果:
[Car{name='奔驰', price=10000.0}
, Car{name='宝马', price=20000.0}
, Car{name='凯迪拉克', price=30000.0}
, Car{name='雷克萨斯', price=40000.0}
]
以上2
个小例子写完了,主要是在实际应用场景中灵活运用了
写完了如果写得有什么问题,希望读者能够给小编留言,也可以点击[此处扫下面二维码关注微信公众号](https://www.ycbbs.vip/?p=28 "此处扫下面二维码关注微信公众号")
看完两件小事
如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:
- 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
- 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
本文著作权归作者所有,如若转载,请注明出处
转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com