• 暑期JAVA学习(39)UDP通信


    一、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();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    /**
     接收端
     */
    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();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32

    (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);
            }
    
        }
    }
    
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    /**
     接收端
     */
    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);
            }
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    (5)UDP的接收端为什么可以接收很多发送端的消息?

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

  • 相关阅读:
    双目视觉实战--单视图测量方法
    B043-JavascriptDOM&Ajax
    获取系统参数System.getProperties()与配置文件参数@Value(“${key}“)
    【ArcGIS微课1000例】0049:制图表达(4)---自由式制图表达
    SQL注入漏洞(MSSQL注入)
    “华为杯”研究生数学建模竞赛2019年-【华为杯】F题:智能飞行器航迹规划模型(下)(附优秀论文及Pyhton代码实现)
    python环境移植,制作可以移植的python环境
    NMEA0813协议简介
    Java中String对象的replaceAll方法调用性能优化小技巧
    35+女生离开互联网大厂后变得更有钱更自由了
  • 原文地址:https://blog.csdn.net/xjl243636988/article/details/126148544