【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();
    }
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值