一、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份数据) |
| 适用范围 | 全网 | 全网 | 局域网 |
| 接收者要求 | 无需加入组 | 必须加入组播组 | 无需加入 |
| 典型应用 | 网页浏览、文件传输 | 视频会议、在线直播 | 局域网设备发现 |