面向编程3-UDP通信程序

一、UDP通信程序

UDP(User Datagram Protocol,用户数据报协议)是一种无连接、不可靠的传输层协议。它就像一个"快递小哥",把包裹(数据)从一个地方送到另一个地方,但不保证一定能送到,也不管你是否收到。

1.发送数据

java 复制代码
package com.lkbhua.UdpAppDemo;

import java.io.IOException;
import java.net.*;

public class demo {
    public static void main(String[] args) throws IOException {
        // udp程序中的发送数据

        // 1、创建DatagramSocket对象(快递公司)
        // 细节:
        // 参数: 绑定的端口,就是通过这个端口向外发送数据
        // 空参: 随机绑定一个端口
        // 端口号范围: 0~65535
        DatagramSocket ds = new DatagramSocket();

        // 2、打包数据
        String data = "hello,udp";
        byte[] bytes = data.getBytes();
        InetAddress inetAddress = InetAddress.getByName("192.168.1.103");
        int port = 10086;
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length, inetAddress, port);

        // 3、发送数据
        ds.send(dp);

        // 4、关闭资源
        ds.close();
    }
}

2. 接受数据

java 复制代码
package com.lkbhua.UdpAppDemo;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.SocketException;

public class ReceiveMessageDemo {
    public static void main(String[] args) throws IOException {
        // Udp接受数据

        // 1、创建DatagramSocket对象(快递公司)
        // 细节:
        // 在接受的时候,一定要绑定端口
        // 而且绑定的端口一定要和发送方绑定的端口一样
        DatagramSocket ds = new DatagramSocket(10086);

        // 2、接收数据包
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);
        ds.receive(dp);

        // 3、解析数据包
        byte[] data = dp.getData();
        int length = dp.getLength();
        InetAddress address = dp.getAddress();
        int port = dp.getPort();
        System.out.println("接收到数据:"+new String(data,0,length)+" 发送方地址:"+address+" 端口:"+port);

    }
}

3. 聊天室

java 复制代码
package com.lkbhua.UdpAppDemo.ChatRoomTest;

import java.io.IOException;
import java.net.*;
import java.util.Scanner;

public class sentTest {
    public static void main(String[] args) throws IOException {
        /*
            按照下面的要求实现程序
                UDP发送数据: 数据来自于键盘输入,直到输入的数据是886,发送数据结束
                UDP接收数据: 因为接收端不知道发送端什么时候停止发送,故采用死循环
        * */

        // 1、创建一个DatagramSocket对象,准备接收数据
        DatagramSocket ds = new DatagramSocket();

        // 2、打包数据
        Scanner sc = new Scanner(System.in);

        while (true) {
            System.out.println("请输入请想要发送的数据:");
            String str = sc.nextLine();
            if ("886".equals(str)) {
                break;
            }
            // 键盘录入的字符串编程字节数组
            byte[] bytes = str.getBytes();

            InetAddress address = InetAddress.getByName("LKBHUA");
            int port = 10086;
            DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);

            // 3、发送数据
            ds.send(dp);
        }
        // 4、关闭发送端
        ds.close();
    }
}
java 复制代码
package com.lkbhua.UdpAppDemo.ChatRoomTest;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;

public class receiveTest {
    public static void main(String[] args) throws IOException {

        // 1、创建DatagramSocket对象
        DatagramSocket ds = new DatagramSocket(10086);

        // 2、接收数据包
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);

        while (true) {
            ds.receive(dp);

            // 3、解析数据包
            byte[] data = dp.getData();
            int len = dp.getLength();
            String ip = dp.getAddress().getHostAddress();
            String name = dp.getAddress().getHostName();

            // 4、输出数据包
            System.out.println("ip为:"+ ip+"主机名字为:"+ name+"的主机人发送了数据:"+ new String(data,0,len));
        }
    }
}

4. Udp的三种通信方式

4.1 单播

单播是最常见的通信方式,一对一通信。数据从一个发送方发送到一个特定的接收者。

左边的电脑只能右边一台电脑进行发送数据。上述代码都是单播

  • 客户端-服务器通信(如浏览器访问网站)
  • 文件下载
  • 实时聊天(如微信、QQ)

4.2 组播

组播是一种一对多的通信方式,数据从一个发送者发送到多个接收者,这些接收者都加入了同一个"组"。

左边的电脑只能右边一组电脑进行发送数据。

适用场景:

  • 视频会议(如Zoom、腾讯会议)
  • 在线直播(如抖音直播、B站直播)
  • 分布式系统中的消息广播
  • IPTV服务

重要提示:组播IP地址:

  • IPv4组播地址范围:224.0.0.0 - 239.255.255.255
  • 例如:224.0.0.1是"本地网络所有组播组"的地址

🌟 小知识:组播不同于"广播",它只发送给加入特定组播组的设备,而不是所有设备。

java 复制代码
package com.lkbhua.UdpAppDemo.GroupDemo;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class receiveDemo {
    public static void main(String[] args) throws IOException {
        /* 组播接收端代码 */

        // 1、创建MulticastSocket对象
        MulticastSocket ms = new MulticastSocket(10086);

        // 2、将当前本机,添加到224.0.0.1的这一组当中
        InetAddress address = InetAddress.getByName("224.0.0.1");
        ms.joinGroup(address);

        // 3、创建DatagramPacket对象,并接收数据
        byte[] bytes = new byte[1024];
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length);

        // 4、接受数据
        ms.receive(dp);

        // 5、解析数据
        byte[] data = dp.getData();
        int length = dp.getLength();
        String ip = dp.getAddress().getHostAddress();
        String name = dp.getAddress().getHostName();
        System.out.println("ip:"+ip+" name:"+name+" data:"+new String(data,0,length));

        // 6、释放资源
        ms.close();
    }
}
java 复制代码
package com.lkbhua.UdpAppDemo.GroupDemo;

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.net.MulticastSocket;

public class sentDemo {
    public static void main(String[] args) throws IOException {
        /* 组播的形式发送代码 */

        // 创建MulticastSocket对象
        MulticastSocket ms = new MulticastSocket();

        // 1.创建DatagramSocket对象
        String s = "hello,udp";
        byte[] bytes = s.getBytes();
        InetAddress address = InetAddress.getByName("224.0.0.1");
        int port = 10086;
        DatagramPacket dp = new DatagramPacket(bytes, bytes.length, address, port);

        // 调用MulticastSocket对象的方法发送数据
        ms.send(dp);

        // 释放资源
        ms.close();
    }
}

4.3 广播

广播是一种一对所有的通信方式,数据从一个发送方发送到同一网络中的所有设备。

左边的电脑只能右边局域网中所有的电脑进行发送数据。

  • 局域网设备发现(如打印机搜索)
  • ARP(地址解析协议)请求
  • 网络配置信息广播

⚠️ 重要提示 :广播地址是255.255.255.255,但只能在局域网内使用,不能跨路由器。

4.4 单播、组播、广播的对比

特性 单播 组播 广播
通信方式 一对一 一对多 一对所有
数据传输 每个接收者单独传输 仅发送一份数据 仅发送一份数据
网络带宽 高(N个接收者需要N份数据) 低(仅需1份数据) 低(仅需1份数据)
适用范围 全网 全网 局域网
接收者要求 无需加入组 必须加入组播组 无需加入
典型应用 网页浏览、文件传输 视频会议、在线直播 局域网设备发现
相关推荐
郝学胜-神的一滴7 小时前
深入解析Python字典的继承关系:从abc模块看设计之美
网络·数据结构·python·程序人生
绵绵细雨中的乡音7 小时前
深入理解 ET 与 LT 模式及其在 Reactor 模型中的应用
服务器·网络·php
吠品7 小时前
企业信任基石OV SSL证书
网络协议·https·ssl
JH30737 小时前
SpringBoot 优雅处理金额格式化:拦截器+自定义注解方案
java·spring boot·spring
暖馒8 小时前
Modbus应用层协议的深度剖析
网络·网络协议·c#·wpf·智能硬件
Coder_Boy_8 小时前
技术让开发更轻松的底层矛盾
java·大数据·数据库·人工智能·深度学习
invicinble9 小时前
对tomcat的提供的功能与底层拓扑结构与实现机制的理解
java·tomcat
较真的菜鸟9 小时前
使用ASM和agent监控属性变化
java
黎雁·泠崖9 小时前
【魔法森林冒险】5/14 Allen类(三):任务进度与状态管理
java·开发语言
yunfuuwqi9 小时前
OpenClaw✅真·喂饭级教程:2026年OpenClaw(原Moltbot)一键部署+接入飞书最佳实践
运维·服务器·网络·人工智能·飞书·京东云