自学Java基础系列-Java udp协议实现单播与广播

UDP介绍

UDP是Uesr Datagram Protocol的简称,中文名称为用户数据报(包)协议。它具有几下几个特点:

  1. UDP协议是一种面向非连接的协议。
    面向非连接指的是在正式通信前不必与对方先建立连接,不管对方状态就直接发送数据。
  2. UDP协议是一种不可靠的协议。
    对方是否可以接收到这些数据,UDP协议无法控制,言外之意就是,使用UDP协议在进行通信,有可能导致数据的丢失。
  3. UPD协议是基于数据包进行传输,数据包不能超过64K。
    UDP 协议适用于一次只传送少量数据、对可靠性要求不高的应用环境。
  4. UDP协议的它的通信效率很高。
    UDP是面向非连接的协议,没有建立连接的过程,因此它的通信效率就很高。

使用场景介绍:UDP协议适用于对效率要求相对高,对准确性要求相对低的场景。

  1. 发短信(只要知道对方的手机号就可以了,不要考虑对方手机处于什么状态)
  2. 即时通信(QQ聊天对数据准确性和丢包要求比较低,但速度必须快)
  3. 在线视频(速度一定要快,保证视频连续,但是偶尔花了一个图像帧,人们还是能接受的)

单播

发送端代码
public class SendDemo {

    // 演示udp通信发送端代码
    public static void main(String[] args) throws Exception {

        // 创建DatagramSocket对(无参构造方法)
        DatagramSocket datagramSocket = new DatagramSocket() ;

        // 创建DatagramPacket对象(封装要发送的数据,以及接收端的ip地址和端口号)
        String s = "Hello,攀博网" ;
        byte[] bytes = s.getBytes("UTF-8");
        int len = bytes.length ;
        InetAddress inetAddress = InetAddress.getByName("127.0.0.1");
        int port = 8888 ;
        DatagramPacket datagramPacket = new DatagramPacket(bytes , len , inetAddress , port) ;

        // 调用DatagramSocket方法完成数据的发送
        datagramSocket.send(datagramPacket);

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

    }

}

发送端代码实现步骤

  1. 创建DatagramSocket对(无参构造方法)
  2. 创建DatagramPacket对象(封装要发送的数据,以及接收端的ip地址和端口号)
  3. 调用DatagramSocket方法完成数据的发送
  4. 释放资源
接收端代码
public class ReceiveDemo {

    // 演示udp通信接收端代码
    public static void main(String[] args) throws Exception {

        // 创建DatagramSocket对象(开放一个端口号)
        DatagramSocket datagramSocket = new DatagramSocket(8888) ;

        // 创建DatagramPacket对象(封装要接收的数据)
        byte[] bytes = new byte[1024];
        int len = bytes.length ;
        DatagramPacket datagramPacket = new DatagramPacket(bytes , len) ;

        // 调用DatagramSocket方法完成数据的接收
        System.out.println("接收数据开始................");
        datagramSocket.receive(datagramPacket);                 // 这个方法是一个阻塞方法,如果没有发送端发送数据过来,线程一直处于阻塞状态
        System.out.println("数据已接收................");

        // 获取发送端的ip地址
        InetAddress inetAddress = datagramPacket.getAddress();
        String ip = inetAddress.getHostAddress();

        // 解析数据
        byte[] data = datagramPacket.getData();         // 获取数据
        int length = datagramPacket.getLength();        // 获取数据的真实长度
        System.out.println(ip + "接收数据:" + new String(data , 0 , length , "UTF-8"));

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

    }

}

接收端代码实现步骤

  1. 创建DatagramSocket对象(开放一个端口号)
  2. 创建DatagramPacket对象(封装要接收的数据)
  3. 调用DatagramSocket方法完成数据的接收
  4. 解析数据
  5. 释放资源

广播

单播就是数据只能发送给一个接收端。如果我想把数据发送给班教室局域网中所有的同学,这种形式就是广播。要实现广播,我们就需要使用广播ip地址255.255.255.255

发送端代码实现

public class SendDemo01 {

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

        // 创建DatagramSocket对象
        DatagramSocket datagramSocket = new DatagramSocket() ;

        // 循环不断进行键盘录入数据,发送数据
        while (true) {

            // 键盘录入数据
            Scanner sc = new Scanner(System.in) ;
            String inputInfo = sc.next();

            // 将录入的数据转换成字节数组
            byte[] bytes = inputInfo.getBytes("UTF-8");
            int length = bytes.length;

            // 构建数据包对象
            DatagramPacket datagramPacket = new DatagramPacket(bytes , length , InetAddress.getByName("255.255.255.255"),8888) ;

            // 发送数据
            datagramSocket.send(datagramPacket);

        }

    }

}

接收端代码不变。

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值