面向编程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份数据)
适用范围 全网 全网 局域网
接收者要求 无需加入组 必须加入组播组 无需加入
典型应用 网页浏览、文件传输 视频会议、在线直播 局域网设备发现
相关推荐
全栈技术负责人几秒前
DeepSeek Harness 业务工具权限插件 dsh-tool-permission设计思路
网络·算法·ai·ai编程
专注仿真8 分钟前
Vapor框架构建及Swift for TensorFlow图像分析
java·其他
逃逸线LOF8 分钟前
Spring的AOP简介
java·后端·spring
希望奇迹很安静10 分钟前
等级保护测评
网络·数据库
Zenova EdgeOS12 分钟前
Linux eBPF 工业边缘性能观测实战
linux·服务器·网络
砚底藏山河14 分钟前
【量化纯GET实战 #21】用 pandas 做分析:把接口数据变成 DataFrame
java·python·金融·maven·pandas
烂蜻蜓22 分钟前
Flask入门教程(二十七):Session Interface API——自定义Session存储后端
网络·ios·flask
Zzzzmo_27 分钟前
Spring MVC
java·spring·mvc·cookie/session
cfm_291430 分钟前
Spring核心设计模式
java·spring·设计模式
Java小白笔记32 分钟前
Java 实现阿里云 OSS 文件上传链路:普通上传、秒传、分片与断点续传
java·开发语言·数据库·spring·阿里云