面向编程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份数据)
适用范围 全网 全网 局域网
接收者要求 无需加入组 必须加入组播组 无需加入
典型应用 网页浏览、文件传输 视频会议、在线直播 局域网设备发现
相关推荐
腻害兔8 小时前
【若依项目-产品经理视角】深度拆解 RuoYi-Vue-Pro 商城模块:从商品管理到交易引擎,50 张表撑起一整套电商系统
java·大数据·vue.js·产品经理·ai编程
码智社9 小时前
AES加密原理详解及Java实现加解密实战
java·开发语言
萧瑟余晖10 小时前
JDK 26 新特性详解
java·开发语言
马优晨11 小时前
Freemarker 完整讲解(后端 Java 模板引擎)
java·开发语言·freemarker·freemarker 完整讲解·freemarker模板引擎
andxe11 小时前
安科士 AndXe 技术博客:400G QSFP112 SR4 光模块|AI 算力与超算短距互联最优方案
网络·人工智能·光模块·光通信
shiyi.十一12 小时前
第2章:应用层 — 知识要点与架构
网络·计算机网络·架构
DFT计算杂谈12 小时前
无 Root 权限在 Tesla K80 零门槛部署 DeepSeek 大模型
linux·服务器·网络·数据库·机器学习
水境传感 李兆栋13 小时前
GNSS 位移监测站 :毫米级感知,筑牢安全监测防线
网络
维天说13 小时前
CLI-Switch 2026年3月版历史设计:Hook、TTY 隔离与 JSON 状态
java·服务器·json
Zane199414 小时前
并发 vs 并行:别再傻傻分不清了,一文讲透 Java 并发编程的第一课
java·后端