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

【Java】UDP网络编程

在这里插入图片描述

文章目录

  • 前言
  • DatagramSocket
  • DatagramPacket
  • 注意事项与区别
  • 代码演示

前言

UDP(user datagram protocol)的中文叫用户数据报协议,属于传输层。 UDP是面向非连接的协议,它不与对方建立连接,而是直接把我要发的数据报发给对方。所以可靠性不高,但具有较低的延迟和较小的网络负载。因此UDP网络通讯编程在实际中,用的比较少,这里只做基本讲解,不深入探讨!


在Java中,DatagramSocket和DatagramPacket(数据包/数据报)实现了基于UDP协议的网络程序;UDP数据报通过数据报套接字(DatagramSocket)发送和接收,系统不保证UDP数据报一定能够安全送到目的地,也不能确定什么时候可以抵达

  • DatagramPacket对象封装了UDP数据报,在数据报中包含了发送端的IP地址和端口号以及接收端的IP地址以及端口号
  • UDP协议中每个数据报都给出了完整的地址信息,因此无需建立发送方和接收方之间的连接

DatagramSocket和DatagramPacket关系如图所示
在这里插入图片描述

  1. 与TCP网络编程不同的是,UDP网络编程没有明确的服务端和客户端。只有接收端和发送端,并且是可以相互变化的(地位相等)
  2. 接收数据和发送数据是通过DatagramSocket对象来完成的
  3. 发送数据前,会将数据封装到DatagramPacket对象(装包),然后进行发送
  4. 当接收到在网络中传送的DatagramPacket对象,需要进行拆包取出数据
  5. DatagramSocket可以指定在哪个端口进行接收数据(等待)

在Java中,UDP协议的数据报最大内存是64K(不适合传输大量的数据)

DatagramSocket

该类代表一个发送和接收数据包的插座,数据报套接字发送或者接收点的分组传送服务。每个发送的数据包或数据报套接字上接收单独寻址和路由。从一台机器发送到另一台机器的多个数据包可能会被不同的路由,并可以以任何顺序到达。

该类提供了5个构造器
在这里插入图片描述

常用的两个方法

  • send(DatagramPacket p):从该DatagramSocket对象向外发送数据报。
    在这里插入图片描述
  • receive(DatagramPacket p):从该DatagramSocket中接收数据报。
    在这里插入图片描述

一个发送(send),一个接收(receive)

在Java中,创建一个UDP服务器或客户端的第一步是创建一个DatagramSocket对象。DatagramSocket是一个用于发送和接收数据报的套接字。以下是创建DatagramSocket对象的示例代码:

DatagramSocket socket = new DatagramSocket();

上述代码创建了一个DatagramSocket对象,并将其绑定到任何可用的本地端口上。要指定端口,请将端口号作为参数传递给DatagramSocket的构造函数。

DatagramPacket

该类表示一个数据报包,数据包是用来实现一个无连接的分组传送服务。每个消息都是从一台机器路由到另一个完全基于包含在该数据包内的信息。从一台机器发送到另一台机器的多个数据包可能会被不同的路由,并可能以任何顺序到达。包交付没有保证。

该类提供了6个构造器
在这里插入图片描述
所有方法如下图
在这里插入图片描述
常用方法

  • getLength():用于对数据进行拆包,返回实际接收到的数据长度
  • getData:返回接收到的数据,返回的是字节数组

DatagramPacket是一个用于在UDP网络中发送和接收数据的类。它包含要发送或接收的数据以及发送或接收数据的目的地。以下是创建DatagramPacket对象的示例代码:

byte[] sendData = "Hello, world!".getBytes();
InetAddress address = InetAddress.getByName("localhost");
int port = 1234;
DatagramPacket packet = new DatagramPacket(sendData, sendData.length, address, port);

上述代码创建了一个DatagramPacket对象,并将其填充为将数据发送到地址为localhost,端口号为1234的UDP服务器。

注意事项与区别

  • 可以把DatagramSocket理解为存放数据的仓库
  • 实际是通过DatagramPacket进行数据的发送(从仓库中发送)和接收(接收到仓库)

代码演示

编写一个接收端和一个发送端;接收端在9999端口(端口可自定义,前提是未被占用)等待接收数据(receive);发送端向接收端发送数据hello;接收端收到发送端发送的数据,回复你好,在退出;发送端接收到回复的数据,之后退出。

注意:接收端和发送端中的DatagramSocket对象端口,是可以一样的,因为这里使用一台电脑作为演示,所示使用两个不同端口(可自行在虚拟机中设置)

接收端

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.InetAddress;/*** 接收端*/
public class UDPReceiver {public static void main(String[] args) throws IOException {//创建一个DatagramSocket对象,准备接收数据(9999端口)DatagramSocket datagramSocket = new DatagramSocket(9999);//构建一个DatagramPacket对象准备接收数据byte[] bytes = new byte[1024];DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length);//调用receive方法接收数据,通过网络传输的DatagramPacket对象填充到接收端的datagramPacket里面datagramSocket.receive(datagramPacket);//当数据报发送到本机的指定端口就会收到数据,没有则会阻塞(等待)//可以把datagramPacket进行拆包,取出数据并显示int length = datagramPacket.getLength();byte[] data = datagramPacket.getData();String file = new String(data, 0, length);//将接收到的字节数组转化为字符串System.out.println(file);//收到数据之后进行回复byte[] bys = "你好".getBytes();datagramPacket = new DatagramPacket(bys, bys.length, InetAddress.getLocalHost(), 9998);datagramSocket.send(datagramPacket);//关闭资源datagramSocket.close();System.out.println("接收端退出");}
}

注意:这里发送端中的DatagramPacket指定发送的位置,因为是在一台电脑操作的,所以使用netAddress.getLocalHost():获取本机IP地址,这里可以换成对面接收端的电脑IP地址 或 使用InetAddress.getByName(“主机IP地址”):获取对应主机的信息,中间填写的是IP或者主机名

发送端

import java.io.IOException;
import java.net.*;/*** 发送端*/
public class UDPSender {public static void main(String[] args) throws IOException {//创建DatagramSocket对象准备接收数据(也可以接收数据)9998端口DatagramSocket datagramSocket = new DatagramSocket(9998);//将需要发送的数据封装到DatagramPacket对象中byte[] bytes = "Hello".getBytes();DatagramPacket datagramPacket = new DatagramPacket(bytes, bytes.length,InetAddress.getLocalHost(),9999);datagramSocket.send(datagramPacket);//接收回复的数据byte[] bysDest = new byte[1024];datagramPacket = new DatagramPacket(bysDest,bysDest.length);datagramSocket.receive(datagramPacket);//将接收的数据进行拆包int length = datagramPacket.getLength();byte[] data = datagramPacket.getData();String s = new String(data, 0,length);System.out.println(s);//关闭资源datagramSocket.close();System.out.println("发送端退出");}
}

相关文章:

【Java】UDP网络编程

文章目录前言DatagramSocketDatagramPacket注意事项与区别代码演示前言 UDP(user datagram protocol)的中文叫用户数据报协议,属于传输层。 UDP是面向非连接的协议,它不与对方建立连接,而是直接把我要发的数据报发给对…...

Springboot源代码总结

前言 编写微服务,巩固知识 文章目录 前言springboot原理springboot启动流程SpringBoot自动配置底层源码解析自动配置到底配了什么?自动配置类条件注解Starter机制@ConditionalOnMissingBeanSpringBoot启动过程源码解析构造SpringApplication对象SpringBoot完整的配置优先级s…...

JVM监控搭建

文章目录JVM监控搭建整体架构JolokiaTelegrafInfluxdbGrafanaJVM监控搭建 整体架构 JVM 的各种内存信息,会通过 JMX 接口进行暴露。 Jolokia 组件负责把 JMX 信息翻译成容易读取的 HTTP 请求。Telegraf 组件作为一个通用的监控 agent,和 JVM 进程部署在…...

java中如何优化大量的if...else...

目录 策略模式(Strategy Pattern) 工厂模式(Factory Pattern) 映射表(Map) 数据驱动设计(Data-Driven Design) 策略模式(Strategy Pattern) 将每个条件分…...

24. linux系统基础

两个进程间想通讯,必须要通过内核,今天讲的信号其实本质也是讲进程间通讯的意思,那么你为什么可以在shell环境下,可以和一个进程发kill-9啊? shell是不是相当于一个进程?你自己运行的那个进程是不是也相当于…...

【C++】面试101,二叉搜索树的最近公共祖先,在二叉树中找到两个节点的最近公共祖先,序列化二叉树,重建二叉树,输出二叉树的右视图,组队竞赛,删除公共字符

目录 1.二叉搜索树的最近公共祖先 2.在二叉树中找到两个节点的最近公共祖先 3.序列化二叉树 4.重建二叉树 5.输出二叉树的右视图 6.组队竞赛 7.删除公共字符 1.二叉搜索树的最近公共祖先 这是一个简单的问题,因为是二叉搜索树(有序)&am…...

Java常见面试题及解答

Java常见面试题及解答1 面向对象的三个特征2 this,super关键字3 基础数据类型4 public、protected、default、private5 接口6 抽象类6.1 抽象类和接口的区别7 重载(overload)、重写(override)8 final、finalize、final…...

【Docker】镜像的原理定制化镜像

文章目录镜像是什么UnionFS(联合文件系统)Docker镜像加载原理制作本地镜像 docker commit -m"提交的描述信息" -a"作者" 容器ID 要创建的目标镜像名:[标签名]案例演示ubuntu安装vim本地镜像发布到阿里云本地镜像发布到阿里云流程将本…...

国内版的ChatGPT弯道超车的机会在哪里?

前言 从去年11月最后一天ChatGPT诞生,截至目前,ChatGPT的热度可谓是爆了。众所周知,ChatGPT是美国“开放人工智能研究中心”研发的聊天机器人程序,它是一个人工智能技术驱动的自然语言处理工具,它能够通过学习和理解人…...

【字符串】

string1.char str[]类型fgets(s,10000,stdin) cin.getline(cin,10000) strlen(str)sizeof 求静态数组长度2.string类型getline(cin,a) cin.getline(cin,10000) str.lenth()str.size()cin 遇到空格就停止3.gets 函数char str[20];gets(str);4.puts 函数puts(str) 相当于 cout<…...

加载驱动之后无法在/dev/下生成vedio0

前言 环境介绍&#xff1a; 1.编译环境 Ubuntu 18.04.5 LTS 2.SDK orangepi Linux 5.4 SDK 3.uboot v2020.04 4.gcc gcc-linaro-7.5.0-2019.12-x86_64_arm-linux-gnueabihf 5.单板 orangepi pc plus 一、问题 继上一篇成功加载gc2035.ko文件之后&#xff0c;理论上…...

Java之类与对象(图文结合)

目录 一、面向对象的初步认知 1、什么是面向对象 2、面向对象与面向过程 二、类定义和使用 1、简单认识类 2、类的定义格式 3、练习 &#xff08;1&#xff09;定义一个狗类 &#xff08;2&#xff09;定义一个学生类 三、类的实例化 1、什么是实例化 2、类和对象的…...

基于 VCS-NLP 的动态低功耗仿真验证介绍

&#x1f525;点击查看精选 IC 技能树系列文章&#x1f525; &#x1f525;点击进入【芯片设计验证】社区&#xff0c;查看更多精彩内容&#x1f525; &#x1f4e2; 声明&#xff1a; &#x1f96d; 作者主页&#xff1a;【MangoPapa的CSDN主页】。⚠️ 本文首发于CSDN&#…...

ESP32-S3 自带usb/jtag初步尝试体验

一、背景 最近在做一台小机器&#xff0c;设备初步规划使用几个实体按钮&#xff0c;这样方便用户戴手套操作。但因为设备有一些需要配置的参数&#xff0c;有需要配备屏幕。但是开发时间比较紧。考虑再三&#xff0c;决定先在初步配备一个简单的控制箱。控制箱上不带屏幕。后…...

前端性能优化总结

前端性能优化是指在设计和开发网站时&#xff0c;采取一些措施来提升网站的性能。这对用户来说是非常重要的&#xff0c;因为高性能的网站可以带来更好的用户体验&#xff0c;同时也有助于提升搜索引擎排名。一、常见前端性能优化措施常见的前端性能优化方法有&#xff1a;压缩…...

React(四) ——hooks的使用

&#x1f9c1;个人主页&#xff1a;个人主页 ✌支持我 &#xff1a;点赞&#x1f44d;收藏&#x1f33c;关注&#x1f9e1; 文章目录⛳React Hooks&#x1f4b8;useState(保存组件状态)&#x1f948;useEffect(处理副作用)&#x1f50b;useCallback&#xff08;记忆函数&#…...

iphone手机热点卡顿多次断连解决办法

文章目录解决方法检查一下几个地方&#xff1a;1.个人热点是否打开2.查看手机是否为4g3.查看手机的最大兼容性开关是否关闭&#xff01;&#xff01;很重要解决方法 检查一下几个地方&#xff1a; 1.个人热点是否打开 这个个人热点容易自动断开&#xff0c;先检查一下是不是…...

设置Typora图床(Github)

PicGo&#xff0c;Github&#xff0c;Typora Nodejs下载&#xff1a; Node.js PicGo下载&#xff1a; GitHub - Molunerfinn/PicGo: A simple & beautiful tool for pictures uploading built by vue-cli-electron-builder 选择downloads或release. 然后进行安装。 Gith…...

jira提交bug规范

一、目的 1&#xff09;方便开发人员根据bug描述快速进行定位问题原因&#xff0c;减少沟通成本。 2&#xff09;规范bug编写&#xff0c;可以提现测试团队的专业性、严谨性。 3&#xff09;可以帮助产品、项目经理及其它人员快速了解bug。 二、说明 本文档主要描述了技术产…...

【数据结构】链表相关题目(中档题)

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a;初阶数据结构 &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对…...

SecGPT-14B开源大模型部署:CSDN平台内开箱即用,省去HuggingFace下载环节

SecGPT-14B开源大模型部署&#xff1a;CSDN平台内开箱即用&#xff0c;省去HuggingFace下载环节 想快速体验一个专注于网络安全问答的14B大模型&#xff0c;但又不想经历从HuggingFace下载几十GB模型文件的漫长等待和复杂配置&#xff1f;现在&#xff0c;在CSDN星图平台上&am…...

2026年4月怎么搭建OpenClaw?腾讯云小白1分钟部署及百炼APIKey配置步骤

2026年4月怎么搭建OpenClaw&#xff1f;腾讯云小白1分钟部署及百炼APIKey配置步骤。OpenClaw&#xff08;原Clawdbot&#xff09;作为2026年主流的AI自动化助理平台&#xff0c;可通过阿里云轻量服务器实现724小时稳定运行&#xff0c;并快速接入钉钉&#xff0c;让AI在企业群聊…...

拆解Meta Ray-Ban同款主控:高通AR1芯片如何让AI眼镜‘听懂’你的手势和眼神?

高通AR1芯片如何赋能Meta Ray-Ban&#xff1a;从异构计算到交互革命 当你的眼镜能读懂眼神、响应手势&#xff0c;甚至预判你的需求时&#xff0c;科技与日常的边界便被重新定义。Meta Ray-Ban智能眼镜之所以成为现象级产品&#xff0c;核心秘密藏在仅指甲盖大小的高通AR1芯片中…...

8-BIT扩散模型前沿:像素极光引擎v1.0.0核心模块源码结构导读

8-BIT扩散模型前沿&#xff1a;像素极光引擎v1.0.0核心模块源码结构导读 1. 像素极光引擎概述 像素极光引擎(Pixel Aurora Engine)是一款基于扩散模型技术打造的8-BIT风格图像生成工具。它采用复古像素游戏风格的交互界面&#xff0c;将现代AI技术与经典游戏美学完美融合。 …...

DeepSeek-Coder-V2终极指南:如何免费打造你的专属AI编程助手

DeepSeek-Coder-V2终极指南&#xff1a;如何免费打造你的专属AI编程助手 【免费下载链接】DeepSeek-Coder-V2 DeepSeek-Coder-V2: Breaking the Barrier of Closed-Source Models in Code Intelligence 项目地址: https://gitcode.com/GitHub_Trending/de/DeepSeek-Coder-V2 …...

从rdt1.0到rdt3.0:可靠数据传输协议的演进与发送接收端FSM解析

1. 可靠数据传输协议的前世今生 第一次接触可靠数据传输协议&#xff08;Reliable Data Transfer&#xff0c;简称rdt&#xff09;是在十多年前的一个网络编程项目里。当时为了确保数据能准确无误地传输&#xff0c;我翻遍了各种资料&#xff0c;最终在《计算机网络&#xff1a…...

宁德时代2026春招开启:6000+offer,这一轮机会在扩大

很多人现在还在犹豫一个问题&#xff1a;新能源是不是已经开始降温了&#xff1f;现在再投&#xff0c;还能不能拿到好的岗位&#xff1f;但从今年的招聘情况来看&#xff0c;趋势其实很清晰&#xff1a;岗位没有减少&#xff0c;而是在结构性增加。尤其是动力电池、储能、电池…...

微服务架构的陷阱:我们是如何从拆分成“微”麻烦的

对于软件测试从业者而言&#xff0c;微服务架构的兴起既带来了前所未有的挑战&#xff0c;也揭示了隐藏在水面之下的诸多陷阱。从单体应用向微服务转型&#xff0c;初衷是为了提升系统的灵活性、可维护性和团队的交付效率。然而&#xff0c;在实践中&#xff0c;许多团队却发现…...

3大核心功能解放明日方舟玩家双手:MAA自动化助手全攻略

3大核心功能解放明日方舟玩家双手&#xff1a;MAA自动化助手全攻略 【免费下载链接】MaaAssistantArknights 《明日方舟》小助手&#xff0c;全日常一键长草&#xff01;| A one-click tool for the daily tasks of Arknights, supporting all clients. 项目地址: https://gi…...

Go Context 取消信号传播机制剖析

Go Context 取消信号传播机制剖析 在并发编程中&#xff0c;如何优雅地控制协程的生命周期是一个关键问题。Go语言通过Context机制提供了一种统一的取消信号传播方式&#xff0c;使得跨协程、跨层级的任务取消变得简单高效。本文将深入剖析Context的取消信号传播机制&#xff…...