欢迎您的访问
专注架构,Java,数据结构算法,Python技术分享

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

引言

UDP 是 User Datagram Protocol的简称, 中文名是用户数据报协议,是 OSIOpen 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个小例子写完了,主要是在实际应用场景中灵活运用了

赞(1) 打赏
版权归原创作者所有,任何形式转载请联系作者;码农code之路 » 十一、网络编程之网络编程-UDP

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

微信扫一扫打赏