当前位置: 首页 > news >正文

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循环就可以使得通信可以不间断,一直发消息一直收消息,也可以加上文件读写的操作使得用户的输入可以更多样化。




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

相关文章:

Java网络编程:UDP通信篇

目录 UDP协议 Java中的UDP通信 DatagramSocket DatagramPacket UDP客户端-服务端代码实现 UDP协议 对于UDP协议,这里简单做一下介绍: 在TCP/IP协议簇中,用户数据报协议(UDP)是传输层的一个主要协议之一&#xf…...

HTML+CSS+JS简易计算器

HTMLCSSJS简易计算器 index.html <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>简易计算器</t…...

STM32使用ST-LINK下载程序中需要注意的几点

使用keil5的ST-link下载界面 前提是ST-LINK已经连接好&#xff0c;&#xff08;下图中是没有连接ST-link设备&#xff09;&#xff0c;只是为了展示如何查看STlink设备是否连接的方式 下载前一定设置下载完成后自启动 这个虽然不是必须&#xff0c;但对立即看到新程序的现象…...

我和jetson-Nano的故事(12)——安装pytorch 以及 torchvision

在jetson nano中安装Anaconda、pytorch 以及 torchvision 1.Pytorch下载安装2.Torchvision安装 1.Pytorch下载安装 首先登录英伟达官网下载Pytorch安装包&#xff0c;这里以PyTorch v1.10.0为例 安装依赖库 sudo apt-get install libjpeg-dev zlib1g-dev libpython3-dev liba…...

「异步魔法:Python数据库交互的革命」(一)

Hi&#xff0c;我是阿佑&#xff0c;今天将和大家一块打开异步魔法的大门&#xff0c;进入Python异步编程的神秘领域&#xff0c;学习如何同时施展多个咒语而不需等待。了解asyncio的魔力&#xff0c;掌握Async SQLAlchemy和Tortoise-ORM的秘密&#xff0c;让你的数据库操作快如…...

探秘GPT-4o:从版本对比到技术能力的全面评价

随着人工智能技术的不断发展&#xff0c;自然语言处理领域的突破性技术——GPT&#xff08;Generative Pre-trained Transformer&#xff09;系列模型也在不断演进。最新一代的GPT-4o横空出世&#xff0c;引起了广泛的关注和讨论。在本文中&#xff0c;我们将对GPT-4o进行全面评…...

四川汇烁面试总结

自我介绍项目介绍、 目录 1.jdk和jre的区别&#xff1f; 2.一段代码的执行流程&#xff1f; 3.接口与抽象类的区别&#xff1f; 4.ArrayList与LinkList的区别&#xff1f; 5.对HashMap的理解? 6.常见的异常&#xff1f; 7.throw 和 throws 有什么区别&#xff1f; 8.…...

【小程序 按钮 表单 】

按钮 代码演示 xxx.wxml <view class"boss" hover-class"box"hover-start-time"2000"hover-stay-time"5000">测试文本<view hover-stop-propagation"true">子集</view><view>子集2</view>…...

高铁Wifi是如何接入的?

使用PC端的朋友&#xff0c;请将页面缩小到最小比例&#xff0c;阅读最佳&#xff01; 在飞驰的高铁上&#xff0c;除了窗外一闪而过的风景&#xff0c;你是否好奇过&#xff0c;高铁Wifi信号如何连接的呢&#xff1f; 远动的火车可不能连接光纤吧&#xff0c;难道是连接的卫星…...

gitlab之docker-compose汉化离线安装

目录 概述离线资源docker-compose结束 概述 gitlab可以去 hub 上拉取最新版本&#xff0c;在此我选择汉化 gitlab &#xff0c;版本 11.x 离线资源 想自制离线安装镜像&#xff0c;请稳步参考 docker镜像的导入导出 &#xff0c;无兴趣的直接使用在此提供离线资源 百度网盘(链…...

【算法】dd爱转转

✨题目链接&#xff1a; dd爱旋转 ✨题目描述 读入一个n∗n的矩阵&#xff0c;对于一个矩阵有以下两种操作 1:顺时针旋180 2:关于行镜像 如 变成 给出q个操作&#xff0c;输出操作完的矩阵 ✨输入描述: 第一行一个数n(1≤n≤1000)&#xff0c;表示矩阵大小 接下来n行&#xff…...

Python3 笔记:IDLE的几个基本设置

1、设置字体&#xff1a; Options > Configure IDLE > Fonts 2、设置文字颜色&#xff08;设置高亮&#xff09;&#xff1a; Options > Configure IDLE > Highlights 3、设置背景颜色&#xff1a; Options > Configure IDLE > Highlights 4、设置窗口&a…...

Mysql:存储过程练习

create table stu( id int(3) primary key auto_increment, name varchar(20) not null, grade float, gender char(2)); insert into stu(name,grade,gender) values(tom,60,男),(jack,70,男),(rose,90,女),(lucy,100,…...

详解Java ThreadLocal

个人博客 详解Java ThreadLocal | iwts’s blog Java ThreadLocal ThreadLocal提供了线程内存储变量的能力&#xff0c;这些变量不同之处在于每一个线程读取的变量是对应的互相独立的。通过get和set方法就可以得到当前线程对应的值。 TreadLocal存储模型 ThreadLocal的静态…...

Unable to parse response body for Response{requestLine=PUT

1 异常信息&#xff1a; Caused by: java.lang.RuntimeException: Unable to parse response body for Response{requestLinePUT /an_path_statistic_log/_doc/11?timeout1m HTTP/1.1, hosthttp://192.168.3.60:9200, responseHTTP/1.1 200 OK}at org.springframework.data.e…...

GitHub的原理及应用详解(六)

本系列文章简介&#xff1a; GitHub是一个基于Git版本控制系统的代码托管平台&#xff0c;为开发者提供了一个方便的协作和版本管理的工具。它广泛应用于软件开发项目中&#xff0c;包括但不限于代码托管、协作开发、版本控制、错误追踪、持续集成等方面。 GitHub的原理可以简单…...

基于PHP+MySQL组合开发的微信小程序分销商城源码系统 分销商城+积分商城+多商户 功能强大 带完整的安装代码包以及搭建教程

系统概述 在当今数字化商业时代&#xff0c;拥有一个强大而多功能的分销商城系统对于企业的发展至关重要。本文将重点介绍基于 PHPMySQL 组合开发的微信小程序分销商城源码系统&#xff0c;它融合了分销商城、积分商城和多商户等功能&#xff0c;不仅功能强大&#xff0c;还提…...

kafka-消费者组偏移量重置

文章目录 1、消费者组偏移量重置1.1、列出所有的消费者组1.2、查看 my_group1 组的详细信息1.3、获取 kafka-consumer-groups.sh 的帮助信息1.4、 偏移量重置1.5、再次查看 my_group1 组的详细信息 1、消费者组偏移量重置 1.1、列出所有的消费者组 [rootlocalhost ~]# kafka-…...

一书读懂Python全栈安全,剑指网络空间安全

写在前面 通过阅读《Python全栈安全/网络空间安全丛书》&#xff0c;您将能够全面而深入地理解Python全栈安全的广阔领域&#xff0c;从基础概念到高级应用无一遗漏。本书不仅详细解析了Python在网络安全、后端开发、数据分析及自动化等全栈领域的安全实践&#xff0c;还紧密贴…...

原生js实现拖拽改变元素顺序

代码展示如下&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>Document</title>…...

以果决其行,只为文化的传承

从他们每一个人的身上&#xff0c;我们看到传神的东西&#xff0c;就是他们都能用结果&#xff0c;去指引自己前进的方向&#xff0c;这正是我要解读倪海厦老师的原因&#xff0c;看倪海厦2012年已经去世&#xff0c;到现在已经十几年时间了&#xff0c;但是我们看现在自学中医…...

Flutter 中的 SizedOverflowBox 小部件:全面指南

Flutter 中的 SizedOverflowBox 小部件&#xff1a;全面指南 在 Flutter 的布局世界中&#xff0c;SizedOverflowBox 是一个相对独特的小部件&#xff0c;它允许子组件溢出其父组件的界限&#xff0c;同时保持父组件的尺寸不变。这在某些特定的布局场景下非常有用&#xff0c;…...

图像视频智能抹除修复解决方案,适应性强,应用广泛

行车录制、现场拍摄等过程中&#xff0c;往往会出现一些难以避免的瑕疵——遮挡物、无关人员、甚至是意外的光线变化&#xff0c;这些都可能影响到视频与图像的质量&#xff0c;降低其观赏性和专业性。 美摄科技&#xff0c;作为行业领先的图像视频智能处理专家&#xff0c;深…...

20240521(代码整洁和测试入门学习)

测试: 1.测试工程师、测试工具开发工程师、自动化测试工程师。 python&#xff1a; 1、发展背景和优势&#xff1b; 2、开始多需的工具 interpreter(解释器) refactor(重构) 2、变量和注释的基础语法 3、输入输出 i 1 for i in range(1, 11): print(i, end ) 不换行打印…...

git中忽略文件的配置

git中忽略文件的配置 一、在项目根目录下创建.gitignore文件二、配置规则如果在配置之前已经提交过文件了&#xff0c;要删除提交过的&#xff0c;如何修改&#xff0c;参考下面的 一、在项目根目录下创建.gitignore文件 .DS_Store node_modules/ /dist# local env files .env…...

如何进行前端职业规划

目录 找准自身定位 未来发展方向 扬长避短很有效 你的出处并不能代表什么 将目标放长放远 职业发展中面临的选择 全栈 or 纯前端? ToB or ToC 赚钱 or 个人成长? 分析每个阶段的需求 为什么不可以一边赚钱一边做喜欢的事情呢 我们还没离开校园的时候,就已经知道要…...

GD32F103系列单片机片上FLASH和ARM介绍

本文章基于兆易创新GD32 MCU所提供的2.2.4版本库函数开发 后续项目主要在下面该专栏中发布&#xff1a; 手把手教你嵌入式国产化_不及你的温柔的博客-CSDN博客 感兴趣的点个关注收藏一下吧! 电机驱动开发可以跳转&#xff1a; 手把手教你嵌入式国产化-实战项目-无刷电机驱动&am…...

Ansible自动化运维中的Setup收集模块应用详解

作者主页&#xff1a;点击&#xff01; Ansible专栏&#xff1a;点击&#xff01; 创作时间&#xff1a;2024年5月22日13点14分 &#x1f4af;趣站推荐&#x1f4af; 前些天发现了一个巨牛的&#x1f916;人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xf…...

再次学习History.scrollRestoration

再次学习History.scrollRestoration 之前在react.dev的源代码中了解到了这个HIstory的属性&#xff0c;当时写了一篇笔记来记录我对它的理解&#xff0c;现在看来还是一知半解。所以今天打算重新学习一下这个属性&#xff0c;主要从属性以及所属对象的介绍、使用方法&#xff0…...

python PyQt5 数字时钟程序

效果图&#xff1a; 概述 本文档将指导您如何使用Python的PyQt5库创建一个简单的时钟程序。该程序将显示当前时间&#xff0c;并具有以下特性&#xff1a; 始终在最前台显示。窗口可拖动。鼠标右键点击窗口可弹出退出菜单。时间标签具有红色渐变效果。窗口初始化时出现在屏幕…...