• Java UDP通信详解:单播、广播、组播


    UDP协议介绍

    1.UDP是一种无连接、不可靠传输的协议;
    2.将数据源IP、目的地IP和端口封装成数据包,不需要建立连接 ;
    3.每个数据包的大小限制在64KB内;
    4.发送不管对方是否准备好,接收方收到也不确认,故是不可靠的;
    5.可以广播发送 ,发送数据结束时无需释放资源,开销小,速度快;

    UDP协议通信场景
    语音通话,视频会话等。

    UDP协议通信模型演示
    在这里插入图片描述

    数据包对象、数据包

    DatagramPacket:数据包对象

    构造器
    在这里插入图片描述
    常用方法
    在这里插入图片描述


    DatagramSocket:发送端和接收端对象

    构造器

    构造器说明
    public DatagramSocket()​创建发送端的Socket对象,系统会随机分配一个端口号
    public DatagramSocket(int port)创建接收端的Socket对象并指定端口号

    常用方法

    方法说明
    public void send(DatagramPacket dp)发送数据包
    public void receive(DatagramPacket p)接收数据包

    单播:一对一、多对一

    单台主机与单台主机之间的通信。

    要使接收端同时接收多台设备的消息,只需接收端保持运行状态,多个发送端都填写正确的接收端地址和端口即可。

    发送端实现步骤

    在这里插入图片描述
    代码示例

    public class ClientDemo1 {
        public static void main(String[] args) throws Exception {
            System.out.println("=====客户端启动======");
    
            // 1、创建发送端对象:发送端自带默认的端口号
            DatagramSocket socket = new DatagramSocket();
    
            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);
            }
    		
    		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 ServerDemo2 {
        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

    广播:一对多通讯

    当前主机与所在网络中的所有主机通信。

    在这里插入图片描述
    UDP如何实现广播
    使用广播地址:255.255.255.255

    具体操作
    1.发送端发送的数据包的目的地写的是广播地址、且指定端口;
    2.本机所在网段的其他主机的程序只要注册对应端口即可;

    发送端代码示例

    public class client {
        public static void main(String[] args) throws Exception {
            System.out.println("=====发送端启动======");
    
            // 1、创建发送端对象:发送端自带默认的端口号
            DatagramSocket socket=new DatagramSocket();
    
            // 2、创建一个数据包对象封装数据
    
            byte[] buffer="UDP广播测试".getBytes();
             只要目的地IP是 255.255.255.255 这个消息将以广播的形式对外发送
            DatagramPacket packet=new DatagramPacket(buffer,buffer.length,InetAddress.getByName("255.255.255.255"),9999);
    
            // 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

    接收端代码示例

    public class serve {
        public static void main(String[] args) throws Exception {
            System.out.println("=====接收端启动======");
    
            // 1.创建一个接受端对象,注册端口
            DatagramSocket socket=new DatagramSocket(9999);
    
            // 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("收到了IP为:"+packet.getAddress()+"\n端口为:"+packet.getPort()+" 的消息");
            System.out.println("消息内容:"+rs);
    
            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

    组播:一对多通讯

    当前主机与选定的一组主机的通信。

    在这里插入图片描述
    UDP如何实现组播
    使用组播地址:224.0.0.0(不含) ~ 239.255.255.255(含)

    具体操作
    1.发送端的数据包的目的地是组播IP (例如:224.0.1.1, 端口:9999);
    2.接收端必须绑定该组播IP(224.0.1.1),端口还要注册发送端的目的端口9999 ,这样即可接收该组播消息;
    3.DatagramSocket的子类MulticastSocket可以在接收端绑定组播IP;

    所在网段的其他主机注册了该组播IP和对应端口即可接收消息

    发送端代码示例

    public class client {
        public static void main(String[] args) throws Exception {
            System.out.println("=====发送端启动======");
    
            // 1、创建发送端对象:发送端自带默认的端口号
            DatagramSocket socket=new DatagramSocket();
    
            // 2、创建一个数据包对象封装数据
            
            byte[] buffer="123".getBytes();
            DatagramPacket packet=new DatagramPacket(buffer,buffer.length,InetAddress.getByName("224.0.1.1"),9999);
    
            // 3、发送数据出去
            socket.send(packet);
    
            socket.close();
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18

    接收端代码示例

    public class serve {
        public static void main(String[] args) throws Exception {
            System.out.println("=====接收端启动======");
    
            // 1.创建一个接受端对象,注册端口
            MulticastSocket socket=new MulticastSocket(9999);
    
            //把当前接收端加入到一个组播中,绑定对应的组播消息IP
    //        socket.joinGroup(InetAddress.getByName("224.0.1.1"));
            //新绑定方法
            socket.joinGroup(new InetSocketAddress(InetAddress.getByName("224.0.1.1"),9999), NetworkInterface.getByInetAddress(InetAddress.getLocalHost()));
    
            // 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("收到了IP为:"+packet.getAddress()+"\n端口为:"+packet.getPort()+" 的消息");
            System.out.println("消息内容:"+rs);
    
            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
  • 相关阅读:
    Shiro
    rsa非对称加密
    Windows10 前端项目所需的node.js安装环境
    实验2:Numpy手写多层神经网络
    Python入门
    常用Linux内核调试手段介绍 03——— 内核笔记
    惊了,国外顶级架构师编写DDD领域驱动设计总结,看到内容后破防了
    技术分享 | app自动化测试(Android)–显式等待机制
    QT使用MSVC编译器时中文报错问题
    I/O多路复用详解
  • 原文地址:https://blog.csdn.net/weixin_52341477/article/details/125448365