【HBZ分享】UDP协议讲解

UDP特点

  1. 面向无连接,即客户端不需要和服务端建立连接
  2. 安全性很低,不可靠协议,容易丢包
  3. 传输速度非常快,不需要像TCP那样三次握手确认服务端在
  4. 由于无视服务器端是否存在,客户端想发就发,就会导致,如果服务器端不存在,会出现数据丢失的情况
  5. 使用场景一般是【聊天工具】更多用的是UDP

UDP协议如何发送数据

  1. 创建发送端socket对象
  2. 发送者提供数据,并将数据封装到数据包
  3. 通过socket服务实现发送功能,将数据包发送出去
  4. 释放资源

UDP协议如何接收数据

  1. 创建接收的socket对象
  2. 接收数据
  3. 解析数据
  4. 输出数据
  5. 释放资源

UDP发送端的代码

 public static void main(String[] args) throws IOException {

//        1. 创建发送端socket对象
        DatagramSocket datagramSocket = new DatagramSocket();
        Scanner sc = new Scanner(System.in);
        while(true){


//        2. 发送者提供数据,并将数据封装到数据包
            // 参数1:发送内容,byte数组类型
            // 参数2:发送数据长度,即byte数组的长度
            // 参数3:InetAddress对象,即【接收方】的ip信息
            // 参数4:端口号port

            String input = sc.nextLine();
            byte[] msg = input.getBytes();
            int msgLength = msg.length;
            // 这个[hbz.test.udp.socket]可以是域名,可以是接受数据的IP地址,我已在本机host文件配置完毕,就是127.0.0.1  hbz.test.udp.socket
            InetAddress inetAddress = InetAddress.getByName("hbz.test.udp.socket");
            int port = 8080;
            DatagramPacket datagramPacket = new DatagramPacket(msg, msgLength, inetAddress, port);

//        3. 通过socket服务实现发送功能,将数据包发送出去
            datagramSocket.send(datagramPacket);

            System.out.println("发送成功,数据内容 :" + new String(msg));
            if("666".equals(new String(msg))){
                break;
            }

        }
//        4. 释放资源
        datagramSocket.close();

    }

UDP接收端的代码

/**
 * UDP接收端、
 *
 * 1. 创建接收的socket对象
 * 2. 创建数据包对象,接收数据
 * 3. 重点:解析数据
 * 4. 输出数据
 * 5. 释放资源
 */

public class UdpServer {

    public static void main(String[] args) throws IOException {

        String receiveStr = "";
        // 1. 创建接收的socket对象, 指定使用8080端口接收,要和客户端对应上
        DatagramSocket datagramSocket = new DatagramSocket(8080);

        // 2. 接收数据 , 每次接受1024byte
        byte[] receiveByte = new byte[1024];
        // 参数1: 用什么来接收数据
        // 参数2: 接收数据的长度
        DatagramPacket datagramPacket = new DatagramPacket(receiveByte, receiveByte.length);

        while (true) {
            //  3. 重点:解析数据, 如果没有接收数据,这里会一直阻塞
            datagramSocket.receive(datagramPacket);
            // 4. 输出数据
            receiveStr = new String(receiveByte);
            System.out.println("接收数据内容:" + receiveStr);
            if("666".equals(receiveStr)){
                break;
            }
        }

        System.out.println("客户端关闭了!");
        // 5. 释放资源
        datagramSocket.close();
    }
}

你可能感兴趣的:(udp,网络协议,网络)