面向编程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份数据)
适用范围 全网 全网 局域网
接收者要求 无需加入组 必须加入组播组 无需加入
典型应用 网页浏览、文件传输 视频会议、在线直播 局域网设备发现
相关推荐
czlczl200209252 小时前
Spring Security 进阶:基于 Customizer 的分布式权限配置架构设计
java·spring boot·分布式·后端·spring
shepherd1262 小时前
从入门到实践:玩转分布式链路追踪利器SkyWalking
java·分布式·后端·skywalking
小尧嵌入式2 小时前
CANOpen协议
服务器·网络·c++·windows
Seven972 小时前
剑指offer-54、字符流中第一个不重复的字符
java
代码游侠2 小时前
学习笔记——网络基础
linux·c语言·网络·笔记·学习·算法
少云清2 小时前
【接口测试】2_代码实现 _设置http请求语法
网络·网络协议·http
武子康2 小时前
Java-209 Spring AMQP 整合 RabbitMQ 实战:XML 配置直连交换机、RabbitAdmin 自动声明与收发闭环
xml·java·spring·rabbitmq·java-rabbitmq·java-activemq
崎岖Qiu3 小时前
【设计模式笔记19】:建造者模式
java·笔记·设计模式·建造者模式
SUPER52666 小时前
本地开发环境_spring-ai项目启动异常
java·人工智能·spring