Java网络编程:UDP通信篇


目录

UDP协议

Java中的UDP通信

DatagramSocket

DatagramPacket

UDP客户端-服务端代码实现


UDP协议

对于UDP协议,这里简单做一下介绍:

在TCP/IP协议簇中,用户数据报协议(UDP)是传输层的一个主要协议之一,它与传输控制协议(TCP)一起构成了互联网的基础。UDP具有以下几个主要特点:

  1. 无连接:UDP是一个无连接的协议,这意味着在通信之前不需要建立连接。每个数据包独立传输,没有握手过程。这使得UDP的传输延迟较低,适合需要快速传输数据的应用场景。
  2. 不可靠传输:UDP不保证数据的可靠传输。数据包可能会丢失、重复或乱序到达。协议本身不提供错误检测和重传机制。如果需要可靠性,必须在应用层实现。
  3. 面向报文:UDP是面向报文的协议。发送方将数据分成独立的报文,每个报文包含完整的消息。接收方按报文接收数据,报文的边界在接收时保持不变。
  4. 低开销:由于UDP没有连接建立、维护和终止的开销,也没有复杂的错误控制和流量控制机制,其报头信息较少,仅包含源端口、目标端口、长度和校验和。这使得UDP的开销非常低,适合需要高效传输的应用。
  5. 支持广播和多播:UDP支持广播和多播,这意味着可以将数据包发送到一个或多个网络中的所有主机。这在某些网络应用中非常有用,例如视频流和在线游戏。
  6. 实时性好:由于没有连接建立和维护的开销,加上较低的协议处理时间,UDP适合实时性要求高的应用,如视频会议、语音通信和在线游戏。
  7. 简单性: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)拿到汉堡(DatagramPacket),然后由外卖小哥将食品包装好,到小李家楼下后通过小李家的门牌号的信息(DatagramSocket)找到小李,并且将汉堡交付给小李。

另外,这里对套接字需要简单的做一个解释:

套接字(Socket)是网络通信的基本组件,它提供了一种机制,使得计算机能够通过网络进行数据传输。套接字是一个抽象概念,用于表示网络通信的一个端点。无论是TCP还是UDP通信,套接字都是必不可少的。


UDP客户端-服务端代码实现

服务器端和客户端在代码实现方面是非常简单的,在前文中有说到:UDP不是面向连接的而且协议本身就很简单。因此在实现方面需要做的功能也很少,大致可以分为以下几步:

  • 创建套接字(DatagramSocket)。
  • 发送(Send)和接收(Receive)数据包(DatagramPacket)。
  • 关闭(Close)套接字。

 还是拿刚才买汉堡的例子,我们就可以这样来实现:

UDP客户端:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Arrays;public class UDPClient {public static void main(String[] args) throws IOException {// 要发送的信息String messg = "我是小李,我想点一个芝士汉堡";// 建立SocketDatagramSocket socket = new DatagramSocket();// 建立收发容器byte[] sendData;byte[] receiveData = new byte[1024];// 发送数据包sendData = messg.getBytes();InetAddress serverAddress = InetAddress.getByName("localhost");DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, serverAddress, 9999);socket.send(sendPacket);// 接收数据包DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);socket.receive(receivePacket);String receivedMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());System.out.println("Received from Server: " + receivedMessage);// 关闭套接字socket.close();}
}

UDP服务端:

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;
import java.util.Arrays;public class UDPServer {public static void main(String[] args) throws IOException {// 要发送的信息String messg = "这里是肯德基,您的芝士汉堡已经制作完毕,祝您用餐愉快";// 建立SocketDatagramSocket socket = new DatagramSocket(9999);try {// 建立收发容器byte[] sendData;byte[] receiveData = new byte[1024];// 接收数据包DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);socket.receive(receivePacket);String receivedMessage = new String(receivePacket.getData(), 0, receivePacket.getLength());System.out.println("Received from Client: " + receivedMessage);// 发送数据包sendData = messg.getBytes();InetAddress clientAddress = receivePacket.getAddress();int clientPort = receivePacket.getPort();DatagramPacket sendPacket = new DatagramPacket(sendData, sendData.length, clientAddress, clientPort);socket.send(sendPacket);} finally {// 关闭套接字if (socket != null && !socket.isClosed()) {socket.close();}}}
}

上述只是一个非常简单的例子,实现了UDP通信中的一发一收的功能。要实现更丰富的功能也只需要稍微改一改就行,比如加上while循环就可以使得通信可以不间断,一直发消息一直收消息,也可以加上文件读写的操作使得用户的输入可以更多样化。




 本次的分享就到此为止了,希望我的分享能给您带来帮助,创作不易也欢迎大家三连支持,你们的点赞就是博主更新最大的动力!如有不同意见,欢迎评论区积极讨论交流,让我们一起学习进步!有相关问题也可以私信博主,评论区和私信都会认真查看的,我们下次再见

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/bicheng/18806.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

3.Spring Cloud LoadBalancer 入门与使用

3.Spring Cloud LoadBalancer 入门与使用 1.什么是 LoadBalancer?1.1负载均衡分类1.2 常见负载均衡策略 2.为什么要学 LoadBalancer?3.如何使用?4.默认负载均衡策略5.随机负载均策略5.1 创建随机负载均衡器5.2 设置随机负载均衡器 (局部设置)5.3 设置全局负载均衡器 6.Nacos…

基础—SQL—DML(数据操作语言)修改和删除

一、引言 接着上次博客,这次讲解DML语句中的修改数据和删除数据操作。 二、DML—修改数据 UPDATE 表名 SET 字段名1值1 ,字段名2值2 , ...[ WHERE 条件]; 注意:修改语句的条件可以有,也可以没有。如果没有条件,则会修改整张表的…

为什么就是不显示呢?

为了练习JavaScript中函数的使用方法&#xff0c;写了下面的关于Date&#xff08;&#xff09;函数的使用&#xff0c;奇怪的是&#xff0c;网页中就是不显示相关内容&#xff0c;为什么呢&#xff1f;&#xff1f;&#xff1f; <!DOCTYPE html> <html lang"en&…

【更新】一次“问题反馈”,下定决心做了多约束多目标智能算法的“模板”

目录 1 主要内容 2 部分代码 3 程序结果 4 下载链接 1 主要内容 关注该代码的同学应该清楚&#xff0c;这个代码已经免费更新了两版了&#xff0c;修复和增加了一些约束内容&#xff0c;本次增加蓄电池初始时刻和终止时刻容量一致约束&#xff0c;可别小瞧这么简单的增加约…

工控一体机10.1寸显示器电容触摸屏(YA05WK)产品规格说明书

如果您对工控一体机有任何疑问或需求&#xff0c;或者对如何集成工控一体机到您的业务感兴趣&#xff0c;可移步控芯捷科技。 一、硬件功能介绍 YA05WK是我公司推出的一款新型安卓屏&#xff0c;4核Cortex-A7 架构&#xff0c;主频1.2GHz的CPU。采用12V供电&#xff0c;标配5寸…

深入理解深度学习中的激活层:Sigmoid和Softmax作为非终结层的应用

深入理解深度学习中的激活层&#xff1a;Sigmoid和Softmax作为非终结层的应用Sigmoid 和 Softmax 激活函数简介Sigmoid函数Softmax函数 Sigmoid 和 Softmax 作为非终结层多任务学习特征变换增加网络的非线性实际案例 注意事项结论 深入理解深度学习中的激活层&#xff1a;Sigmo…

【Python】 深入理解 Python 包管理器:pip vs conda

基本原理 在Python编程世界中&#xff0c;包管理器是一个不可或缺的工具。它帮助开发者安装、更新和管理Python库。目前&#xff0c;最流行的两个包管理器是pip和conda。了解它们之间的区别&#xff0c;对于Python开发者来说至关重要。 pip pip是Python的官方包管理器&#…

智慧农田视频监控技术应用:智能监管引领农业新时代

据新闻报道&#xff0c;5月24日合肥市公安局接到群众报警&#xff0c;反映自己辛苦种植的小麦有几十亩地被人偷偷用收割机盗割。公安机关迅速出警并立案侦查&#xff0c;通过查看监控视频得知&#xff0c;用户所在的公司租用了几千亩土地进行农业种植&#xff0c;因公司与村民之…

【C语言】9.C语言函数栈帧的创建和销毁

C语言函数栈帧的创建和销毁 看完本文你能了解什么? 局部变量是怎么创建的&#xff1f;为什么局部变量的值是随机值&#xff1f;函数是怎么传参的&#xff1f;传参的顺序是怎么样的&#xff1f;实参和形参是什么关系&#xff1f;函数调用是怎么做的&#xff1f;函数调用结束后怎…

LeetCode hot100-57-G

17. 电话号码的字母组合 给定一个仅包含数字 2-9 的字符串&#xff0c;返回所有它能表示的字母组合。答案可以按 任意顺序 返回。给出数字到字母的映射如下&#xff08;与电话按键相同&#xff09;。注意 1 不对应任何字母。不会&#xff0c;放IDEA里执行了一下大概理解了流程 …

深圳比创达电子|EMC与EMI滤波器:电子设备的“电磁防护罩”

在电子科技日新月异的今天&#xff0c;电磁兼容性&#xff08;EMC&#xff09;问题越来越受到工程师和技术人员的关注。其中&#xff0c;电磁干扰&#xff08;EMI&#xff09;和电磁干扰抑制&#xff08;即EMI滤波器&#xff09;是实现良好EMC性能的关键技术之一。 一、EMC与E…

KineFX —— 简介

KineFX是绑定和动画的框架和工具集&#xff0c;可在SOP级别创建和编辑角色&#xff1b;可从头创建自己的KineFX角色&#xff0c;或使用特定的KineFX SOP和常规的SOP去编辑导入的角色和动画&#xff1b; 程序化绑定 KineFX构建与程序化绑定的原则上&#xff0c;可快速非破坏性迭…

AI绘画Stable Diffusion【艺术写真】:蒙版法图生图,局部重绘实现AI艺术写真

大家好&#xff0c;我是设计师阿威 之前我分享过几篇使用SD插件换脸方式实现AI写真的教程&#xff0c;主要存在2个大的问题。 &#xff08;1&#xff09;人脸相似度 &#xff08;2&#xff09;生成的图片整体色调有时候会比较怪异 对于上面的问题&#xff0c;在对图片质量要…

每天写两道(二)LRU缓存、数组中最大的第k个元素

146.LRU 缓存 . - 力扣&#xff08;LeetCode&#xff09; 请你设计并实现一个满足 LRU (最近最少使用) 缓存 约束的数据结构。 实现 LRUCache 类&#xff1a; LRUCache(int capacity) 以 正整数 作为容量 capacity 初始化 LRU 缓存int get(int key) 如果关键字 key 存在于缓存…

在table表格中如何给tr的每一个子元素加haver效果

效果图&#xff1a; 核心代码&#xff1a; tbody tr :hover {background-color: #d5d5d5; } 改变子元素 tbody tr:hover {background-color: #d5d5d5; } 改变父元素 两段代码看起来一样&#xff0c;其实不一样&#xff0c;其中差了一个空格字符 希望可以帮到大家

多线程新手村3--多线程代码案例

1.1 单例模式 单例模式是设计模式中非常经典的一种。那么有同学肯定就会好奇了&#xff0c;什么是设计模式呢&#xff1f; 设计模式简单的说就是程序员的“棋谱”&#xff0c;我们下象棋时肯定或多或少都背过棋谱&#xff0c;例如当头炮、马后炮等&#xff0c;设计模式也是这…

接口性能测试复盘:解决JMeter超时问题的实践

在优化接口并重新投入市场后&#xff0c;我们面临着一项关键任务&#xff1a;确保其在高压环境下稳定运行。于是&#xff0c;我们启动了一轮针对该接口的性能压力测试&#xff0c;利用JMeter工具模拟高负载场景。然而&#xff0c;在测试进行约一分钟之后&#xff0c;频繁出现了…

剧本杀小程序开发,探索市场发展新的商业机遇

剧本杀游戏作为一个新兴行业&#xff0c;经历了爆发式的增长&#xff0c;剧本杀游戏在市场中的热度不断升高。 不过&#xff0c;在市场的火热下&#xff0c;竞争也在逐渐加大。因此&#xff0c;在市场竞争下&#xff0c;成本低、主题多样、有趣的线上剧本杀小程序成为了创业者…

竹云董事长在第二届ICT技术发展与企业数字化转型高峰论坛作主题演讲

5月25日&#xff0c;由中国服务贸易协会指导&#xff0c;中国服务贸易协会信息技术服务委员会主办的 “第二届ICT技术发展与企业数字化转型高峰论坛” 在北京隆重召开。 本次论坛以 “数据驱动&#xff0c;AI引领&#xff0c;打造新质生产力” 为主题&#xff0c;特邀业内200余…

WebGL实现医学教学软件

使用WebGL实现医学教学软件是一个复杂但非常有益的项目&#xff0c;可以显著提升医学教育的互动性和效果。以下是详细的实现步骤&#xff0c;包括需求分析、技术选型、开发流程和注意事项。北京木奇移动技术有限公司&#xff0c;专业的软件外包开发公司&#xff0c;欢迎交流合作…