UDP:用户数据报协议(User Datagram Protocol)。UDP是无连接通信协议,即在数据传输时,数据的发送端和接收端不建立逻辑连接。简单来说,当一台计算机向另外一台计算机发送数据时,发送端不会确认接收端是否存在,就会发出数据,同样接收端在收到数据时,也不会向发送端反馈是否收到数据。

由于使用UDP协议消耗资源小,通信效率高,所以通常都会用于音频、视频和普通数据的传输例如视频会议都使用UDP协议,因为这种情况即使偶尔丢失一两个数据包,也不会对接收结果产生太大影响。

但是在使用UDP协议传送数据时,由于UDP的面向无连接性,不能保证数据的完整性,因此在传输重要数据时不建议使用UDP协议。UDP的交换过程如下图所示。

UDP通信程序 - 图1

特点:数据被限制在64kb以内,超出这个范围就不能发送了。

数据报(Datagram):网络传输的基本单位

UDP接收发送消息程序

发送端通过键盘输入消息,接收端实时接收消息
此程序需要用到的类:
DatagramPacket 用于创建数据包对象,封装要发送的数据、接收端ip、端口
DatagramPacket构造方法:
DatagramPacket(byte[] buf, int length, InetAddress address, int port)
DatagramSocket 用于数据包的发送和接收对象
DatagramSocket构造方法:
DatagramSocket()空参数
方法: send(DatagramPacket d)

接收端实现:

  1. 创建DatagramSocket对象,绑定端口号,要和发送端端口号一致
  2. 创建字节数组,接收发来的数据
  3. 创建数据包对象DatagramPacket
  4. 调用DatagramSocket对象方法
    receive(DatagramPacket dp)接收数据,数据放在数据包中
  5. 拆包
  • 发送的IP地址
    数据包对象DatagramPacket方法getAddress()获取的是发送端的IP地址对象
    返回值是InetAddress对象
    - 接收到的字节个数
    数据包对象DatagramPacket方法 getLength()
    - 发送方的端口号
    数据包对象DatagramPacket方法 getPort()发送端口
  1. 关闭资源 ```java //实现UDP接收端 public class UDPReceive { public static void main(String[] args) throws IOException {

    1. //创建数据包传输对象 绑定端口号
    2. DatagramSocket datagramSocket = new DatagramSocket(7000);
    3. //创建字节数组
    4. byte[] b = new byte[1024 * 64];
    5. //通过无限循环来实现实时通信的接收
    6. while (true) {
    7. //创建数据包对象,传递字节数组
    8. DatagramPacket datagramPacket = new DatagramPacket(b, b.length);
    9. //调用datagramPacket对象的方法receive接收
    10. datagramSocket.receive(datagramPacket);
    11. //获取接收到的字节个数
    12. int length = datagramPacket.getLength();
    13. //获取发送端的ip地址
    14. String address = datagramPacket.getAddress().getHostAddress();
    15. //获取发送端的端口号
    16. int port = datagramPacket.getPort();
    17. //打印接收的数据
    18. System.out.println("ip:\t" + address + "\n端口:\t" + port + "\n消息:\t" +
    19. new String(b, 0, length) + "\n");
    20. }

    // datagramSocket.close(); }

}

<a name="cbpdh"></a>
#### 发送端实现: 
```java
//实现UDP发送端
public class UDPSend {
    public static void main(String[] args) throws IOException {
        Scanner sc = new Scanner(System.in);

        //创建InetAddress对象,封装要发送信息的ip
        InetAddress inetAddress = InetAddress.getByName("127.0.0.1");

        //创建DatagramSocket对象,数据包的发送和接收对象
        DatagramSocket datagramSocket = new DatagramSocket();
        //通过无限循环来实现实时通信的发送
        while (true) {
            String s = sc.nextLine();
            //创建数据包对象,封装要发送的数据、接收端ip、端口
            byte[] b = s.getBytes();
            DatagramPacket datagramPacket = new DatagramPacket(b, b.length, inetAddress, 7000);
            //调用datagramSocket的方法send
            datagramSocket.send(datagramPacket);
        }
        //关闭资源
//        datagramSocket.close();
    }

}