1. 首页
  2. 网络编程教程

011-十一、网络编程之网络编程-UDP

引言

UDPUser Datagram Protocol的简称, 中文名是用户数据报协议,是 OSIOpen System Interconnection,开放式系统互联) 参考模型中一种无连接的传输层协议,提供面向事务的简单不可靠信息传送服务,IETF RFC 768UDP 的正式规范。UDPIP 报文的协议号是 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 "此处扫下面二维码关注微信公众号")

看完两件小事

如果你觉得这篇文章对你挺有启发,我想请你帮我两个小忙:

  1. 关注我们的 GitHub 博客,让我们成为长期关系
  2. 把这篇文章分享给你的朋友 / 交流群,让更多的人看到,一起进步,一起成长!
  3. 关注公众号 「方志朋」,公众号后台回复「666」 免费领取我精心整理的进阶资源教程
  4. JS中文网,Javascriptc中文网是中国领先的新一代开发者社区和专业的技术媒体,一个帮助开发者成长的社区,是给开发者用的 Hacker News,技术文章由为你筛选出最优质的干货,其中包括:Android、iOS、前端、后端等方面的内容。目前已经覆盖和服务了超过 300 万开发者,你每天都可以在这里找到技术世界的头条内容。

    本文著作权归作者所有,如若转载,请注明出处

    转载请注明:文章转载自「 Java极客技术学习 」https://www.javajike.com

    标题:011-十一、网络编程之网络编程-UDP

    链接:https://www.javajike.com/article/1234.html

« 012-十二、网络编程-Socket(一)
010-十、网络编程多线程之线程池»

相关推荐

QR code