位置:首页 > Java > UDP网络程序开发入门与实现方法

UDP网络程序开发入门与实现方法

时间:2026-08-15  |  作者:多维游侠  |  阅读:0

UDP通信案例说明

前面两个小节讲解了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所示。

UDP网络程序开发入门与实现方法_wishdown.com

图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所示。

UDP网络程序开发入门与实现方法_wishdown.com

图2 运行结果

发送端程序分析

文件2创建了一个UDP发送端程序,用来发送数据。

在创建DatagramPacket对象时,需要指定目标IP地址和端口号。而且,端口号必须要和接收端指定的端口号一致。这样调用DatagramSocket的send()方法,才能将数据发送到对应的接收端。

通信结果展示

在接收端程序阻塞的状态下,运行发送端程序,接收端程序就会收到发送端发送的数据而结束阻塞状态,打印接收的数据如图3所示。

UDP网络程序开发入门与实现方法_wishdown.com

图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字节。

免责声明:文中图文均来自网络,如有侵权请联系删除,心愿游戏发布此文仅为传递信息,不代表心愿游戏认同其观点或证实其描述。

相关文章

更多

精选合集

更多

大家都在玩

热门话题

大家都在看

更多