面向编程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份数据)
适用范围 全网 全网 局域网
接收者要求 无需加入组 必须加入组播组 无需加入
典型应用 网页浏览、文件传输 视频会议、在线直播 局域网设备发现
相关推荐
考虑考虑1 天前
JDK25模块导入声明
java·后端·java ee
_小马快跑_1 天前
Java 的 8 大基本数据类型:为何是不可或缺的设计?
java
Re_zero1 天前
线上日志被清空?这段仅10行的 IO 代码里竟然藏着3个毒瘤
java·后端
洋洋技术笔记1 天前
Spring Boot条件注解详解
java·spring boot
Jony_2 天前
高可用移动网络连接
网络协议
程序员清风2 天前
程序员兼职必看:靠谱软件外包平台挑选指南与避坑清单!
java·后端·面试
皮皮林5512 天前
利用闲置 Mac 从零部署 OpenClaw 教程 !
java
chilix2 天前
Linux 跨网段路由转发配置
网络协议
华仔啊2 天前
挖到了 1 个 Java 小特性:var,用完就回不去了
java·后端
SimonKing2 天前
SpringBoot整合秘笈:让Mybatis用上Calcite,实现统一SQL查询
java·后端·程序员