UDP网络程序开发入门与实现方法
时间:2026-08-15 | 作者:多维游侠 | 阅读:0UDP通信案例说明
前面两个小节讲解了DatagramPacket和DatagramSocket的相关知识。接下来,通过一个案例来学习它们的具体用法。
要实现UDP通信,需要创建一个发送端程序和一个接收端程序。
在通信时,只有接收端程序先运行,才能避免因发送端发送的数据无法接收,而造成数据丢失。因此,首先需要完成接收端程序的编写,如文件1所示。
文件1 UDPReceiver.ja va
1 import ja va.net.*;
2 // 接收端程序
3 public class UDPReceiver {
4 public static void main(String[] args) throws Exception {
5 // 定义一个指定端口号为8900的接收端DatagramSocket对象
6 DatagramSocket server = new DatagramSocket(8900);
7 // 定义一个长度为1024的字节数组,用于接收数据
8 byte[] buf = new byte[1024];
9 // 定义一个DatagramPacket数据报对象,用于封装接收的数据
10 DatagramPacket packet = new DatagramPacket(buf, buf.length);
11 System.out.println("等待接收数据...");
12 while (true){
13 // 等待接收数据报数据,在没有接收到数据之前会处于阻塞状态
14 server.receive(packet);
15 // 调用DatagramPacket的方法获得接收到的信息,并转换为字符串形式
16 String str = new String(packet.getData(),
17 0, packet.getLength());
18 System.out.println(packet.getAddress()+ ":"
19 + packet.getPort()+"发送消息:"+str);
20 }
21 }
22 }
接收端运行结果
运行结果如图1所示。
图1 运行结果
接收端程序分析
文件1中,创建了一个UDP接收端程序,用来接收数据。
在创建DatagramSocket对象时,指定其监听的端口号为8900。这样,发送端就能通过这个端口号与接收端程序进行通信。
之后创建DatagramPacket对象时,传入一个大小为1024个字节的数组,用来接收数据。
当调用该对象的receive(DatagramPacket p)方法接收到数据以后,数据会填充到DatagramPacket中。通过DatagramPacket的相关方法,可以获取接收到的数据信息。
从图1不难看出,程序运行后会一直停在那里,等待接收数据,但始终没有输出拿到的主机信息。
原因就在于DatagramSocket的receive()方法:它在运行时是阻塞的。
换句话说,只要发送端程序还没有把数据发过来,这个方法就不会结束阻塞,程序也就没法继续往下执行。
发送端程序实现
实现了接收端程序之后,接下来还需要编写一个发送端的程序,如文件2所示。
文件2 UDPSender.ja va
1 import ja va.net.*;
2 // 发送端程序
3 public class UDPSender {
4 public static void main(String[] args) throws Exception {
5 // 定义一个指定端口号为3000的发送端DatagramSocket对象
6 DatagramSocket client = new DatagramSocket(3000);
7 // 定义要发送的数据
8 String str = "hello world";
9 // 定义一个DatagramPacket数据报对象,封装发送端信息以及发送地址
10 DatagramPacket packet = new DatagramPacket(str.getBytes(),
11 str.getBytes().length,
12 InetAddress.getByName("localhost"),8900);
13 System.out.println("开始发送信息...");
14 client.send(packet); // 发送数据
15 client.close(); // 释放资源
16 }
17 }
发送端运行结果
运行结果如图2所示。
图2 运行结果
发送端程序分析
文件2创建了一个UDP发送端程序,用来发送数据。
在创建DatagramPacket对象时,需要指定目标IP地址和端口号。而且,端口号必须要和接收端指定的端口号一致。这样调用DatagramSocket的send()方法,才能将数据发送到对应的接收端。
通信结果展示
在接收端程序阻塞的状态下,运行发送端程序,接收端程序就会收到发送端发送的数据而结束阻塞状态,打印接收的数据如图3所示。
图3 运行结果
端口号说明
需要注意的是,在创建发送端的DatagramSocket对象时,可以不指定端口号。
而指定端口号目的就是,为了每次运行时接收端的getPort()方法返回值都是一致的。
否则,发送端的端口号由系统自动分配,接收端的getPort()方法的返回值每次都不同。
注意事项
UDP程序发送数据时,并不是一点点往外推,而是会一次性把内容封装进DatagramPacket数据报里,再整体发出去。
DatagramPacket一次能装下的数据并不是无限的。
理论上的上限是65507字节,也就是IP数据报最大长度65535字节,减去IP首部20字节和UDP首部8字节后剩下的空间。
不过在实际环境里,能用到的大小通常远小于这个理论值。
很多平台上的实际限制往往只有8192字节(8K),有些甚至还不到8K。
也正因为如此,如果发送端一次性发出的数据报超过8K,就必须格外小心。多数情况下,这种更大的数据包很可能会被直接截断到8K。
再看文件11-2,接收DatagramPacket数据报时使用的缓存区大小被设置成了1024字节。如果发送端传来的数据过大,很明显,同样会造成数据丢失。
所以,通常这种场景下,接收端DatagramPacket数据报的缓存区会设置为UDP数据理论最大限制65507字节。
不过本程序处理的数据量比较小,因此缓冲区才设置为1024字节。
免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。
相关文章
更多-
- 迅捷路由器怎么调信号最强,设置时要注意什么?
- 时间:2026-08-27
-
- vivo浏览器怎么卸不掉?原因和解决方法在这里
- 时间:2026-08-27
-
- OPPO R11s黑屏了,怎么强制恢复出厂设置?
- 时间:2026-08-27
-
- 飞利浦显示器包装盒有生产日期和保修期吗?怎么看?
- 时间:2026-08-27
-
- 联想新平板开机必须联网吗?怎么做?
- 时间:2026-08-27
-
- 平板横竖屏切换设置与问题解决
- 时间:2026-08-27
-
- 移动电源容量怎么测?要准备哪些工具?
- 时间:2026-08-27
-
- 荣耀90 Pro防水吗?防水级别多少?怎么用才安全
- 时间:2026-08-27
精选合集
更多大家都在玩
大家都在看
更多-
- 糖尿病完全不能吃糖吗
- 时间:2026-09-15
-
- 蚂蚁庄园小课堂2026年9月16日最新题目答案
- 时间:2026-09-15
-
- 小鸡答题今天的答案是什么2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园每日答题答案2026年9月16日
- 时间:2026-09-15
-
- 以下哪种粮食是酿造绍兴黄酒的主要原料 蚂蚁庄园今日答案9月16日
- 时间:2026-09-15
-
- 劝学名句“及时当勉励,岁月不待人”出自哪位诗人 蚂蚁庄园今日答案9.16
- 时间:2026-09-15
-
- 蚂蚁庄园今天答题答案2026年9月16日
- 时间:2026-09-15
-
- 蚂蚁庄园答题今日答案2026年9月16日
- 时间:2026-09-15


