Java网络编程:UDP通讯篇

[复制链接]
发表于 2026-1-13 17:22:37 | 显示全部楼层 |阅读模式


目次
UDP协议
Java中的UDP通讯
DatagramSocket
DatagramPacket
UDP客户端-服务端代码实现


UDP协议

对于UDP协议,这里简朴做一下先容:
在TCP/IP协议簇中,用户数据报协议(UDP)是传输层的一个紧张协议之一,它与传输控制协议(TCP)一起构成了互联网的根本。UDP具有以下几个紧张特点:

  • 无毗连:UDP是一个无毗连的协议,这意味着在通讯之前不必要创建毗连。每个数据包独立传输,没有握手过程。这使得UDP的传输延伸较低,得当必要快速传输数据的应用场景。
  • 不可靠传输:UDP不包管数据的可靠传输。数据包大概会丢失、重复或乱序到达。协议自己不提供错误检测和重传机制。假如必要可靠性,必须在应用层实现。
  • 面向报文:UDP是面向报文的协议。发送方将数据分成独立的报文,每个报文包罗完备的消息。汲取方按报文汲取数据,报文的界限在汲取时保持稳定。
  • 低开销:由于UDP没有毗连创建、维护和停止的开销,也没有复杂的错误控制和流量控制机制,其报头信息较少,仅包罗源端口、目标端口、长度和校验和。这使得UDP的开销非常低,得当必要高效传输的应用。
  • 支持广播和多播:UDP支持广播和多播,这意味着可以将数据包发送到一个或多个网络中的全部主机。这在某些网络应用中非常有效,比方视频流和在线游戏。
  • 实时性好:由于没有毗连创建和维护的开销,加上较低的协议处理惩罚时间,UDP得当实时性要求高的应用,如视频聚会会议、语音通讯和在线游戏。
  • 简朴性:UDP协议相对简朴,实现和使用都比力方便。应用步伐可以直接在UDP之上构建,并根据必要添加错误处理惩罚、重传等机制。
实用场景


  • 实时应用:如视频流、语音通讯、在线游戏等,要求低延伸和实时性,数据丢失影响较小。
  • 简朴查询服务:如DNS查询,发送一个哀求并渴望快速相应,偶然的丢包可以通过重试办理。
  • 广播和多播:如网络发现、服务公告等,必要将消息发送给多个主机。

Java中的UDP通讯

市面上大部门Java应用存在着大量的通讯互换的需求,那相识了UDP协议的相干信息和使用场景后,对于Java步伐我们该怎样来实现通讯呢?
   在Java中实现UDP通讯涉及两个紧张类:DatagramSocketDatagramPacket
  DatagramSocket

DatagramSocket类用于创建和管理UDP套接字。它负责发送和汲取数据包,并提供了根本的网络通讯功能
紧张功能包罗:


  • 绑定到特定的IP所在和端口。
  • 发送和汲取DatagramPacket。
  • 管理网络毗连的根本设置(比方超时、缓冲区巨细)。
紧张方法


  • DatagramSocket(): 创建一个绑定到恣意可用端口的套接字。
  • DatagramSocket(int port): 创建一个绑定到指定端口的套接字。
  • DatagramSocket(int port, InetAddress laddr): 创建一个绑定到指定端口和当地所在的套接字。
  • send(DatagramPacket p): 发送数据包。
  • receive(DatagramPacket p): 汲取数据包。
  • close(): 关闭套接字。
更多具体的方法和参数解说可以查察oracle官方的API文档
   DatagramSocket (Java SE 17 & JDK 17) (oracle.com)
  这里是中文版本的:
   DatagramSocket - Java17中文文档 - API参考文档 - 全栈举措派 (qzxdp.cn)
  DatagramPacket

DatagramPacket类用于表现一个数据包。它包罗发送或汲取的数据,以及目标或泉源的IP所在和端口。
紧张功能包罗:


  • 封装数据(字节数组)。
  • 存储发送或汲取数据包的目标或泉源信息(IP所在和端口)。
紧张方法


  • DatagramPacket(byte[] buf, int length): 创建用于汲取数据的数据包。
  • DatagramPacket(byte[] buf, int length, InetAddress address, int port): 创建用于发送数据的数据包。
  • getData(): 获取数据包中的数据。
  • getLength(): 获取数据包中数据的长度。
  • getAddress(): 获取数据包的目标或泉源所在。
  • getPort(): 获取数据包的目标或泉源端口。
  • setData(byte[] buf): 设置数据包中的数据。
  • setLength(int length): 设置数据包中数据的长度。
  • setAddress(InetAddress address): 设置数据包的目标所在。
  • setPort(int port): 设置数据包的目标端口。
笔者这里还是将官方的API文档和对应的中文文档给出:
   DatagramPacket (Java SE 17 & JDK 17) (oracle.com)
    DatagramPacket - Java17中文文档 - API参考文档 - 全栈举措派 (qzxdp.cn)
  DatagramSocket紧张通过DatagramPacket来传输和汲取数据。在UDP通讯中,DatagramPacket用于封装数据和相干信息(如目标所在和端口),而DatagramSocket则用于现实的发送和汲取利用。
   举个点外卖的例子来分析,假如本日是疯狂星期四,小李想要点个肯德基的芝士汉堡,DatagramSocket就相对于是肯德基的大门以及小李家的大门,DatagramPacket就相对于是外卖小哥,小李点的汉堡等食品就相对于是要传输的数据,当肯德基做豪杰堡后,外卖小哥通过肯德基的大门的所在信息(DatagramSocket)拿到汉堡(数据),然后由外卖小哥将食品包装好,到小李家楼下后通过小李家的门牌号的信息(DatagramSocket)找到小李,而且将汉堡交付给小李。
  别的,这里对套接字必要简朴的做一个表明:
   套接字(Socket)是网络通讯的根本组件,它提供了一种机制,使得盘算性可以或许通过网络举行数据传输。套接字是一个抽象概念,用于表现网络通讯的一个端点。无论是TCP还是UDP通讯,套接字都是必不可少的。
  
UDP客户端-服务端代码实现

服务器端和客户端在代码实现方面好坏常简朴的,在前文中有说到:UDP不是面向毗连的而且协议自己就很简朴。因此在实现方面必要做的功能也很少,大抵可以分为以下几步:


  • 创建套接字(DatagramSocket)。
  • 发送(Send)和汲取(Receive)数据包(DatagramPacket)。
  • 关闭(Close)套接字。
 还是拿刚才买汉堡的例子,我们就可以如许来实现:
UDP客户端:
  1. import java.io.IOException;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. import java.net.InetAddress;
  5. import java.util.Arrays;
  6. public class UDPClient {
  7.     public static void main(String[] args) throws IOException {
  8.         // 要发送的信息
  9.         String messg = "我是小李,我想点一个芝士汉堡";
  10.         // 建立Socket
  11.         DatagramSocket socket = new DatagramSocket();
  12.         // 建立收发容器
  13.         byte[] sendData;
  14.         byte[] receiveData = new byte[1024];
  15.         // 发送数据包
  16.         sendData = messg.getBytes();
  17.         InetAddress serverAddress = InetAddress.getByName("localhost");
  18.         DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverAddress, 9999);
  19.         socket.send(sendPacket);
  20.         // 接收数据包
  21.         DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
  22.         socket.receive(receivePacket);
  23.         String receivedMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());
  24.         System.out.println("Received from Server: " + receivedMessage);
  25.         // 关闭套接字
  26.         socket.close();
  27.     }
  28. }
复制代码
UDP服务端:
  1. import java.io.IOException;
  2. import java.net.DatagramPacket;
  3. import java.net.DatagramSocket;
  4. import java.net.InetAddress;
  5. import java.util.Arrays;
  6. public class UDPServer {
  7.     public static void main(String[] args) throws IOException {
  8.         // 要发送的信息
  9.         String messg = "这里是肯德基,您的芝士汉堡已经制作完毕,祝您用餐愉快";
  10.         // 建立Socket
  11.         DatagramSocket socket = new DatagramSocket(9999);
  12.         try {
  13.             // 建立收发容器
  14.             byte[] sendData;
  15.             byte[] receiveData = new byte[1024];
  16.             // 接收数据包
  17.             DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
  18.             socket.receive(receivePacket);
  19.             String receivedMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());
  20.             System.out.println("Received from Client: " + receivedMessage);
  21.             // 发送数据包
  22.             sendData = messg.getBytes();
  23.             InetAddress clientAddress = receivePacket.getAddress();
  24.             int clientPort = receivePacket.getPort();
  25.             DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, clientAddress, clientPort);
  26.             socket.send(sendPacket);
  27.         } finally {
  28.             // 关闭套接字
  29.             if (socket != null && !socket.isClosed()) {
  30.                 socket.close();
  31.             }
  32.         }
  33.     }
  34. }
复制代码
上述只是一个非常简朴的例子,实现了UDP通讯中的一发一收的功能。要实现更丰富的功能也只必要轻微改一改就行,好比加上while循环就可以使得通讯可以不停止,不绝发消息不绝收消息,也可以加上文件读写的利用使得用户的输入可以更多样化。



 本次的分享就到此为止了,渴望我的分享能给您带来资助,创作不易也欢迎各人三连支持,你们的点赞就是博主更新最大的动力!
如有差异意见,欢迎批评区积极讨论互换,让我们一起学习进步!
有相干标题也可以私信博主,批评区和私信都会认真查察的,我们下次再见


免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!qidao123.com:ToB企服之家,中国第一个企服评测及软件市场,开放入驻,技术点评得现金

本帖子中包含更多资源

您需要 登录 才可以下载或查看,没有账号?立即注册

×
回复

使用道具 举报

登录后关闭弹窗

登录参与点评抽奖  加入IT实名职场社区
去登录
快速回复 返回顶部 返回列表