暑期JAVA学习(39)UDP通信

本文详细介绍了UDP通信的基本概念、DatagramPacket和DatagramSocket的使用方法,包括发送消息和接收消息的过程,并探讨了多发多收的实现案例。重点讲解了UDP协议的特点和如何创建和操作数据包对象,适合初学者理解无连接、不可靠的UDP通信原理。
摘要由CSDN通过智能技术生成

一、UDP通信:快速入门

(1)UDP协议的特点

●UDP是一种无连接、不可靠传输的协议。

●将数据源IP、目的地IP和端口以及数据封装成数据包,大小限制在64KB内,直接发送出去即可。

(2)UDP协议通信模型演示

在这里插入图片描述
在这里插入图片描述

(3)DatagramPacket:数据包对象(韭菜盘子)
构造器说明
public DatagramPacket(byte[] buf, int length, InetAddress address, int port)创建发送端数据包对象
buf:要发送的内容,字节数组
length:要发送内容的字节长度
address:接收端的IP地址对象
port:接收端的端口号
public DatagramPacket(byte[] buf, int length)建接收端的数据包对象
buf:用来存储接收的内容
length:能够接收内容的长度
(4)DatagramPacket常用方法
方法说明
public int getLength()获得实际接收到的字节个数
(4)DatagramSocket:发送端和接收端对象(人)
构造器说明
public DatagramSocket()创建发送端的Socket对象,系统会随机分配一个端口号。
public DatagramSocket(int port)创建接收端的Socket对象并指定端口号
(5)DatagramSocket类成员方法
方法说明
public void send(DatagramPacket dp)发送数据包
public void receive(DatagramPacket p)接收数据包
(6)具体使用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

/**
 发送端  一发 一收
 */
public class ClientDemo01 {
    public static void main(String[] args) throws Exception {
        System.out.println("=====客户端启动======");

        // 1、创建发送端对象:发送端自带默认的端口号(人)
        DatagramSocket socket = new DatagramSocket(6666);

        // 2、创建一个数据包对象封装数据(韭菜盘子)
        /**
         public DatagramPacket(byte buf[], int length,
         InetAddress address, int port)
         参数一:封装要发送的数据(韭菜)
         参数二:发送数据的大小
         参数三:服务端的主机IP地址
         参数四:服务端的端口
         */
        byte[] buffer = "韭菜啊韭菜".getBytes();
        DatagramPacket packet = new DatagramPacket( buffer, buffer.length,
                InetAddress.getLocalHost() , 8888);

        // 3、发送数据出去
        socket.send(packet);

        socket.close();
    }
}
/**
 接收端
 */
public class ServerDemo02 {
    public static void main(String[] args) throws Exception {
        System.out.println("=====服务端启动======");
        // 1、创建接收端对象:注册端口(人)
        DatagramSocket socket = new DatagramSocket(8888);

        // 2、创建一个数据包对象接收数据(韭菜盘子)
        byte[] buffer = new byte[1024 * 64];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

        // 3、等待接收数据。
        socket.receive(packet);

        // 4、取出数据即可
        // 读取多少倒出多少
        int len = packet.getLength();
        String rs = new String(buffer,0, len);
        System.out.println("收到了:" + rs);

        // 获取发送端的ip和端口
        String ip  =packet.getSocketAddress().toString();
        System.out.println("对方地址:" + ip);

        int port  = packet.getPort();
        System.out.println("对方端口:" + port);

        socket.close();
    }
}
(7)使用UDP通信实现:发送消息、接收消息
①发送消息步骤

●需求:客户端实现步骤
①创建DatagramSocket对象(发送端对象)---------------------------------------->扔韭菜的人
②创建DatagramPacket对象封装需要发送的数据(数据包对象)----------------> 韭菜盘子
③使用DatagramSocket对象的send方法传入DatagramPacket对象 -------->开始抛出韭菜
④释放资源

②接收消息步骤

●需求:接收端实现步骤
①创建DatagramSocket对象并指定端口(接收端对象)------------------------->接韭菜的人
②创建DatagramPacket对象接收数据(数据包对象)------------------------------->韭菜盘子
③使用DatagramSocket对象的receive方法传入DatagramPacket对象 ----->开始接收韭菜
④释放资源

(8)总结

①UDP发送端和接收端的对象是哪个?
●public DatagramSocket()​:创建发送端的Socket对象
●public DatagramSocket(int port):创建接收端的Socket对象

②数据包对象是哪个?
●DatagramPacket

③如何发送、接收数据包
使用DatagramSocket的如下方法:
●public void send(DatagramPacket dp):发送数据包
●public void receive(DatagramPacket dp) :接收数据包

二、UDP通信:多发多收

(1)案例

需求:
●使用UDP通信方式开发接收端和发送端。

分析:
①发送端可以一直发送消息。
②接收端可以不断的接收多个发送端的消息展示。
③发送端输入了exit则结束发送端程序。

(2)发送端可以反复发送数据

●需求:客户端实现步骤
①创建DatagramSocket对象(发送端对象)------------------------------------->扔韭菜的人
②使用while死循环不断的接收用户的数据输入,如果用户输入的exit则退出程序
③如果用户输入的不是exit, 把数据封装成DatagramPacket --------------------> 韭菜盘子
④使用DatagramSocket对象的send方法将数据包对象进行发------------> 开始抛出韭菜
⑤释放资源

(3)接收端可以反复接收数据

●需求:接收端实现步骤
①创建DatagramSocket对象并指定端口(接收端对象)---------------------->接韭菜的人
②创建DatagramPacket对象接收数据(数据包对象)---------------------------->韭菜盘子
③使用while死循环不断的进行第4步
④使用DatagramSocket对象的receive方法传入DatagramPacket对象–>开始接收韭菜

(4)具体使用

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

/**
 发送端  多发 多收
 */
public class ClientDemo01 {
    public static void main(String[] args) throws Exception {
        System.out.println("=====客户端启动======");

        // 1、创建发送端对象:发送端自带默认的端口号(人)
        DatagramSocket socket = new DatagramSocket(7777);


        Scanner sc = new Scanner(System.in);
        while (true) {
            System.out.println("请说:");
            String msg = sc.nextLine();

            if("exit".equals(msg)){
                System.out.println("离线成功!");
                socket.close();
                break;
            }

            // 2、创建一个数据包对象封装数据(韭菜盘子)
            byte[] buffer = msg.getBytes();
            DatagramPacket packet = new DatagramPacket( buffer, buffer.length,
                    InetAddress.getLocalHost() , 8888);

            // 3、发送数据出去
            socket.send(packet);
        }

    }
}

/**
 接收端
 */
public class ServerDemo02 {
    public static void main(String[] args) throws Exception {
        System.out.println("=====服务端启动======");
        // 1、创建接收端对象:注册端口(人)
        DatagramSocket socket = new DatagramSocket(8888);

        // 2、创建一个数据包对象接收数据(韭菜盘子)
        byte[] buffer = new byte[1024 * 64];
        DatagramPacket packet = new DatagramPacket(buffer, buffer.length);

        while (true) {
            // 3、等待接收数据。
            socket.receive(packet);
            // 4、取出数据即可
            // 读取多少倒出多少
            int len = packet.getLength();
            String rs = new String(buffer,0, len);
            System.out.println("收到了来自:" + packet.getAddress() +", 对方端口是" + packet.getPort() +"的消息:" + rs);
        }
    }
}
(5)UDP的接收端为什么可以接收很多发送端的消息?

●接收端只负责接收数据包,无所谓是哪个发送端的数据包

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

呦呦呦欸哟哟

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值