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

一文理解TCP与UDP


Socket套接字

Socket套接字,是由系统提供用于网络通信的技术,是基于TCP/IP协议的网络通信的基本操作单元。 基于Socket套接字的网络程序开发就是网络编程。

Socket套接字主要针对传输层协议划分为如下三类:

  1. 流套接字:使用传输层TCP协议
  2. 数据报套接字:使用传输层UDP协议
  3. 原始套接字

那么这三种协议有什么不同呢?接下来我们就一个一个认识,

传输层TCP协议

TCP,即Transmission Control Protocol(传输控制协议),传输层协议。

以下为TCP的特点:

  1. 有连接
  2. 可靠传输
  3. 面向字节流
  4. 有接收缓冲区,也有发送缓冲区
  5. 大小不限

注意:下文会讲解这些特点到底是什么意思。

对于字节流来说,可以简单的理解为,传输数据是基于IO流,流式数据的特征就是在IO流没有关闭的 情况下,是⽆边界的数据,可以多次发送,也可以分开多次接收。

传输层UDP协议

UDP,即User Datagram Protocol(用户数据报协议),传输层协议。 以下为UDP的特点

  1. 无连接
  2. 不可靠传输
  3. 面向数据报
  4. 有接收缓冲区,无发送缓冲区
  5. 大小受限:一次最多传输64k

原因: 我们注意到, UDP协议首部中有⼀个16位的最大长度. 也就是说一个UDP能传输的数据最大长度是 64K(包含UDP首部).

  1. 注意:下文会讲解这些特点到底是什么意思。

对于数据报来说,可以简单的理解为,传输数据是⼀块⼀块的,发送⼀块数据假如100个字节,必须⼀ 次发送,接收也必须⼀次接收100个字节,⽽不能分100次,每次接收1个字节。

至于第三种就不详细讲了,想了解的可以自己找资料来了解哦。这里就简单讲作用:

原始套接字用于自定义传输层协议,用于读写内核没有处理的IP协议数据。 我们不学习原始套接字,简单了解即可。

下面讲解一下上面tcp所说的特点:

  1. 有连接:在数据传输开始之前,必须在两端建立一个连接。这通过一个称为三次握手的过程完成。
  2. 可靠性:TCP确保数据正确无误地从源传输到目的地。它通过序列号、确认应答、重传机制等来实现。但也不是绝对安全的,只是在传输中尽量保证数据正确无误。
  3. 全双工通信:TCP允许通信双方同时发送和接收数据。可以简单理解为:可以从左到右,也可从右到左,左右代表通信双方
  4. 字节流:虽然应用程序可能发送的是消息或数据块,但TCP将它们视为字节流。后面代码中就会发现我们使用TCP网络编程时会使用到输出流和输入流即:InputStream和OutputStream。
  5. 面向数据包:UDP是面向报文的,只在应用层交下来的报文前增加了首部后就向下交付网络层。它指的是协议在传输数据时将数据封装成一个个独立的数据单元,这些数据单元被称为数据包。

当然上面对两种协议的解释是比较简陋的。


UDP数据报套接字

想要学会实现UDP数据报套接字,那就先要认识两个类 DatagramSocket和 DatagramPacket (也可以说是两个api)

两个类的主要作用:

DatagramSocket:用于发送和接收数据的。

DatagramPacket: 是DatagramSocket发送和接收的数据报。

一个形象的比喻:一个是快递车(DatagramSocket),一个是包裹(DtagramPacket)


DtagramPacket的主要方法:

DatagramPacket(byte[] buf, int length):构造⼀个DatagramPacket以⽤来接收数据报,接收的 数据保存在字节数组(第⼀个参数buf)中,接收指定 ⻓度(第⼆个参数length)

DatagramPacket(byte[] buf, int offset, int length, SocketAddress address): 构造⼀个DatagramPacket以⽤来发送数据报,发送的数据为字节数组(第⼀个参数buf)中,从0到指定⻓ 度(第⼆个参数length)。address指定⽬的主机的IP 和端⼝号


DtagramSocket的主要方法:

InetAddress getAddress() :从接收的数据报中,获取发送端主机IP地址;或从发 送的数据报中,获取接收端主机IP地址

int getPort(): 从接收的数据报中,获取发送端主机的端口号;或从 发送的数据报中,获取接收端主机端口号


下面就是服务端和客户端实现一个简单的回响服务端(即收到并返回客户端发来的请求)和客户端

服务端:

首先我们就需要先构造一个DatagramSocket,我们这里就先创建一个没有实例化的DatagramSocket socket,然后在构造方法中实例化这个socket对象,并且我们就传入一个端口号port通过调用socket的带参数的方法进行设置该服务端的端口号。

然后设置一个启动服务端的方法start(),在start中我们的服务器上线,然后我们需要用一个while循环不断区接收来自客户端的请求。这里我们先初始化一个DatagramPacket对象,然后调用DatagramSocket的receive方法并把DatagramPacket对象传入进方法中进行获取请求,这时请求就是储存在这个DatagramPacket中。

再然后把DatagramPacket对象的数据通过new String(packet.getData(),0, packet.getLength())获取String类型的请求,并通过process处理请求获取响应respond。

最后将String类型的respond转化为一个DatagramPacket对象的数据(相当于打包包裹)这里的包裹与接收不一样,发送时需要加上要发送去的目标客户端的ip和端口号,我们可以使用packet.getSocketAddress()获取这两样东西放入构造方法中即可,然后交给快递车发货(即:DatagramSocket)

import java.io.IOException;
import java.net.DatagramPacket;
import java.net.DatagramSocket;
import java.net.SocketException;public class UdpService {DatagramSocket socket;public UdpService(int port) throws SocketException {socket=new DatagramSocket(port);}public void start() throws IOException {System.out.println("服务器启动");while(true){DatagramPacket packet=new DatagramPacket(new byte[4096],4096);socket.receive(packet);String request=new String(packet.getData(),0, packet.getLength());String respond=process(request);DatagramPacket packetrespond=new DatagramPacket(respond.getBytes(),0,respond.getBytes().length,packet.getSocketAddress());socket.send(packetrespond);System.out.println("port:"+packetrespon.getPort()+"ip"+packetrespon.getAddress());}}private String process(String request) {return request;}public static void main(String[] args) throws IOException {UdpService service=new UdpService(9090);service.start();}}

TCP流套接字

在TCP流套接字编程中,我们要学习到两个比较重要的类(也可以说是API),那么是哪两个类呢,接下来我们就来学习一下吧。

这两个类分别是

  • ServerSocket:主要是服务端使用,是创建TCP服务端Socket的API。
  • Socket:无论是服务端还是客户端,都是需要使用这个类。

ServerSocket类

ServerSocket的构造方法是需要传入一个端口号, ServerSocket(int port) ;用来作为这个服务端的端口号。

ServerSocket常用的方法就是: Socket accept() ,其返回值为Socket

accept作用: 开始监听指定端⼝(创建时绑定的端⼝),有客⼾端 连接后,返回⼀个服务端Socket对象,并基于该 Socket建⽴与客⼾端的连接,否则阻塞等待

Socket类

Socket的构造方法需要传入两个值, Socket(String host, int port) ,一个String以及int类型,分别代表要访服务器的IP地址和服务器端口号。

不管是客户端还是服务端Socket,都是双方建立链接以后,保存的对端信息,以及用来与对方接受数据的。

Socket本身是是无法直接传输数据的,但是它可以通过本身的方法获取对应的流对象,通过流对象进行,请求和反应。以下是Socket的一些方法:

InetAddress getInetAddress() 返回套接字所连接的地址

InputStream getInputStream() 返回此套接字的输⼊流

OutputStream getOutputStream() 返回此套接字的输出流

简单模拟实现一下服务端和客户端:

服务端:

import java.io.*;
import java.net.ServerSocket;
import java.net.Socket;
import java.util.Scanner;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Executors;public class TcpServer {private ServerSocket serverSocket=null;public TcpServer(int port) throws IOException {serverSocket=new ServerSocket(port);}public void start() throws IOException {ExecutorService executorService= Executors.newCachedThreadPool();while(true){Socket socket=serverSocket.accept();executorService.submit(()->{processConnection(socket);});}}private String process(String request) {return request;}private void processConnection(Socket socket)  {System.out.println("客户端上线");try(InputStream inputStream=socket.getInputStream();OutputStream outputStream=socket.getOutputStream()){//套一层壳Scanner sc=new Scanner(inputStream);PrintWriter writer=new PrintWriter(outputStream);while(true) {if (!sc.hasNext()) {System.out.println("客户端下线");break;}//套壳读请求String request = sc.next();//套壳回响String respond = process(request);writer.println(respond);writer.flush();System.out.println("已经回响"+"ip:"+socket.getInetAddress());}} catch (IOException e) {throw new RuntimeException(e);}finally {try {serverSocket.close();} catch (IOException e) {throw new RuntimeException(e);}}}public static void main(String[] args) throws IOException {TcpServer tcpServer=new TcpServer(9090);tcpServer.start();}}

服务端中:

首先创建一个TcpServer类,把这个对象作为一个服务端,这个类的成员属性就是上面所说的ServerSocket类对象开始时我们将这个类对象初始化为null,在构造方法时传入一个端口号对ServerSocket成员在进行实例化如: serverSocket=new ServerSocket(port),在这个类中我们需要创建一个start();方法作为服务器启动的一个方法。在start方法中,我们里面需要到调用一个processConnection方法,这个方法是主要处理一次链接的请求,也可以理解为一个客户端链接请求。

讲完了TcpServer里该有的基本成员,那么我们就讲讲具体的方法是如何实现的:

在start中我们先是建了一个线程池用来服务多用户一起访问这个服务器,发出请求。再使用一个while循环,不断的执行ServerSocket的accept方法进行获取Socket对象,每个线程执行processConnection方法,并将accept获取的Socket对象传给processConnection方法,开始处理一个客户端的请求并响应。

再然后就到了我们的processConnection方法,在这个方法中我们可以先是打印一个客户端上线,然后通过socket对象建立输出,输入流对象,然后可以选择用Scanner和PrintWrite进行套壳使用,然后我们通过scanner读取到来自客户端得到的请求,然后再通过一个process方法进行处理,转化返回对应得响应(这里我们主要是简单的回响服务器,即简单再返回请求的字符串即可),然后我们再使用套壳的PrintWrite对象进行给客户端响应即里的println方法,响应给服务端即可。注意的是write在执行完println后需要在执行flush方法,将写入减缓冲区的响应彻底清除响应给客户端。以及最后记得在finally中关闭Socket对象。与UDP不同,主要看生命周期。

通过主要的这三步,我们基本可以构造一个简单的回响服务端,如果想要更新成更加高级的服务器,那么我们只需要改动一下process方法即可,把里面的逻辑改一下,不在是回响请求即可。

客户端:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.io.PrintWriter;
import java.net.Socket;
import java.util.Scanner;public class TcpClient {private Socket socketClient=null;public TcpClient(String ip,int port) throws IOException {socketClient=new Socket(ip,port);}public void start(){Scanner sc=new Scanner(System.in);try(InputStream inputStream=socketClient.getInputStream();OutputStream outputStream=socketClient.getOutputStream()){PrintWriter writer=new PrintWriter(outputStream);Scanner scanner=new Scanner(inputStream);while(true){System.out.println("请输入你的需求");String request=sc.next();writer.println(request);writer.flush();String respond=scanner.next();System.out.println(respond);}} catch (IOException e) {throw new RuntimeException(e);}}public static void main(String[] args) throws IOException {TcpClient tcpClient=new TcpClient("127.0.0.1",9090);tcpClient.start();}}

客户端:

  1. 客户端我们还是构造一个一个类TcpClient,然后里面先是初始化一个null的Socket对象,然后在带参的构造方法中进行实例化,其中参数分别是服务端的ip和端口号。
  2. 那么还是老样子,定义一个start方法,进行启动客户端,在里面我们还是先创建出输出流和输入流 在进行Scanner和PrintWrite进行套壳,其中我们还要额外创建一个scanner对象里面传入的是System.in进行读取控制台输入的请求,再由输入流传给服务端,然后输出流PrintWrite进行接受响应,注意write这里不要使用print,因为在服务端中我们使用了!sc.hasNext(),如果我们的请求使用的print而不是println则会使服务端读取请求时出现一些小bug。

相关文章:

一文理解TCP与UDP

Socket套接字 Socket套接字,是由系统提供用于网络通信的技术,是基于TCP/IP协议的网络通信的基本操作单元。 基于Socket套接字的网络程序开发就是网络编程。 Socket套接字主要针对传输层协议划分为如下三类: 流套接字:使用传输层…...

智能指针RAII

引入:智能指针的意义是什么? RAll是一种利用对象生命周期来控制程序资源(如内存、文件句柄、网络连接、互斥量等等)的简单技术。 在对象构造时获取资源,接着控制对资源的访问使之在对象的生命周期内始终保持有效&#…...

AI护航化工:《山西省危化品视频智能分析指南》下的视频分析重构安全体系

化工和危化品行业的AI智能视频分析应用:构建安全与效率新范式 一、行业背景与挑战 化工和危化品行业是国民经济的重要支柱,但生产过程涉及高温、高压、易燃易爆等高风险场景。传统安全监管依赖人工巡检和固定监控设备,存在效率低、盲区多、…...

GitHub SSH Key 配置详细教程(适合初学者,Windows版)-学习记录4

GitHub SSH Key 配置详细教程(适合初学者,Windows版) 本教程适用于在 Windows 系统下,将本地 Git 仓库通过 SSH 方式推送到 GitHub,适合没有配置过 SSH key 的初学者。 1. 检查是否已有 SSH key 打开 Git Bash 或 Po…...

初识Linux · NAT 内网穿透 内网打洞 代理

目录 前言: 内网穿透和打洞 NAPT表 内网穿透 内网打洞 正向/反向代理 前言: 本文算是网络原理的最后一点补充,为什么说是补充呢,因为我们在前面第一次介绍NAT的时候详细介绍的是报文从子网到公网,却没有介绍报文…...

docker-compose使用详解

Docker-Compose 是 Docker 官方提供的容器编排工具,用于简化多容器应用的定义、部署和管理。其核心功能是通过 YAML 配置文件(docker-compose.yml)定义服务、网络和存储卷,并通过单一命令实现全生命周期的管理。以下从核心原理、安…...

使用计算机视觉实现目标分类和计数!!超详细入门教程

什么是物体计数和分类 在当今自动化和技术进步的时代,计算机视觉作为一项关键工具脱颖而出,在物体计数和分类任务中提供了卓越的功能。 无论是在制造、仓储、零售,还是在交通监控等日常应用中,计算机视觉系统都彻底改变了我们感知…...

并发编程中的对象组合的哲学

文章目录 引言对象组合与安全委托实例封闭技术基于监视器模式的对象访问对象不可变性简化委托原子维度的访问现有容器的并发安全的封装哲学使用继承使用组合小结参考引言 本文将介绍通过封装技术,保证开发者不对整个程序进行分析的情况下,就可以明确一个类是否是线程安全的,…...

03-Web后端基础(Maven基础)

1. 初始Maven 1.1 介绍 Maven 是一款用于管理和构建Java项目的工具,是Apache旗下的一个开源项目 。 Apache 软件基金会,成立于1999年7月,是目前世界上最大的最受欢迎的开源软件基金会,也是一个专门为支持开源项目而生的非盈利性…...

禁忌搜索算法:从原理到实战的全解析

禁忌搜索算法:从原理到实战的全解析 一、算法起源与核心思想 禁忌搜索(Tabu Search, TS)由美国工程院院士Fred Glover于1986年正式提出,其灵感源于人类的记忆机制——通过记录近期的搜索历史(禁忌表)&…...

从加密到信任|密码重塑车路云一体化安全生态

目录 一、密码技术的核心支撑 二、典型应用案例 三、未来发展方向 总结 车路云系统涉及海量实时数据交互,包括车辆位置、传感器信息、用户身份等敏感数据。其安全风险呈现三大特征: 开放环境威胁:V2X(车与万物互联&#xff0…...

【ffmpeg】SPS与PPS的概念

PPS(Picture Parameter Set)详解 PPS(图像参数集)是H.264/H.265视频编码标准中的关键数据结构,与SPS(序列参数集)共同组成视频的解码配置信息,直接影响视频的正确解码和播放。以下是…...

Java垃圾回收与JIT编译优化

1. Java中的垃圾回收 垃圾回收是Java内存管理的核心,负责自动回收不再被应用程序引用的对象内存,从而防止内存泄漏并优化资源使用。以下详细介绍垃圾回收的机制、算法及优化实践。 1.1 垃圾回收的必要性 垃圾回收解决了手动内存管理中的常见问题,如内存泄漏和悬空指针。它…...

mmaction2——tools文件夹下

build_rawframes.py 用法示例 python tools/data/build_rawframes.py data/videos data/frames --task rgb --level 2 --ext mp4 --use-opencv --num-worker 8总结: 只需要 RGB 帧,推荐 --use-opencv,简单高效,无需额外依赖。 …...

论文阅读:Next-Generation Database Interfaces:A Survey of LLM-based Text-to-SQL

地址:Next-Generation Database Interfaces: A Survey of LLM-based Text-to-SQL 摘要 由于用户问题理解、数据库模式解析和 SQL 生成的复杂性,从用户自然语言问题生成准确 SQL(Text-to-SQL)仍是一项长期挑战。传统的 Text-to-SQ…...

Devicenet主转Profinet网关助力改造焊接机器人系统智能升级

某汽车零部件焊接车间原有6台焊接机器人(采用Devicenet协议)需与新增的西门子S7-1200 PLC(Profinet协议)组网。若更换所有机器人控制器或上位机系统,成本过高且停产周期长。 《解决方案》 工程师选择稳联技术转换网关…...

【HTML-5】HTML 实体:完整指南与最佳实践

1. 什么是 HTML 实体&#xff1f; HTML 实体是一种在 HTML 文档中表示特殊字符的方法&#xff0c;这些字符如果直接使用可能会与 HTML 标记混淆&#xff0c;或者无法通过键盘直接输入。实体由 & 符号开始&#xff0c;以 ; 分号结束。 <p>这是一个小于符号的实体&am…...

MySQL 索引详解与原理分析

MySQL 索引详解与原理分析 一、什么是索引&#xff1f; 索引&#xff08;Index&#xff09;是数据库表中一列或多列的值进行排序的一种数据结构&#xff0c;可以加快数据的检索速度。索引类似于书本的目录&#xff0c;通过目录可以快速定位到想要的内容&#xff0c;而不用全书…...

游戏引擎学习第303天:尝试分开对Y轴和Z轴进行排序

成为我们自己的代码精灵α 所以现在应该可以正常使用了。不过&#xff0c;这两周我们没办法继续处理代码里的问题&#xff0c;而之前留在代码里的那个问题依然存在&#xff0c;没有人神奇地帮我们修复&#xff0c;这让人挺无奈的。其实我们都希望有个神奇的“代码仙子”&#…...

javaweb-html

1.交互流程&#xff1a; 浏览器向服务器发送http请求&#xff0c;服务器对浏览器进行回应&#xff0c;并发送字符串&#xff0c;浏览器能对这些字符串&#xff08;html代码&#xff09;进行解释&#xff1b; 三大web语言&#xff1a;&#xff08;1&#xff09;html&#xff1a…...

3.2.3

# 导入必要的库 import onnx import numpy as np from PIL import Image import onnxruntime as ort # 定义预处理函数&#xff0c;用于将图片转换为模型所需的输入格式 def preprocess(image_path): input_shape (1, 1, 64, 64) # 模型输入期望的形状&#xff0c;这里…...

Redis 8.0 GA,重回开源

在数字化浪潮的推动下&#xff0c;实时数据处理已成为现代应用的核心需求。作为全球广泛使用的 NoSQL 数据库&#xff0c;Redis 8.0 不仅通过 30 余项性能改进重新定义了实时数据处理的速度极限&#xff0c;更通过整合社区资源与开放授权模式&#xff0c;进一步巩固其在开源生态…...

心联网(社群经济)视角下开源AI智能名片、链动2+1模式与S2B2C商城小程序源码的协同创新研究

摘要&#xff1a;在心联网&#xff08;社群经济&#xff09;理论框架下&#xff0c;本文构建了开源AI智能名片、链动21模式与S2B2C商城小程序源码的技术协同体系&#xff0c;提出"情感连接-利益驱动-生态裂变"三维创新模型。通过实证分析与案例研究&#xff0c;验证该…...

【图像大模型】Hunyuan-DiT:腾讯多模态扩散Transformer的架构创新与工程实践

Hunyuan-DiT&#xff1a;腾讯多模态扩散Transformer的架构创新与工程实践 一、架构设计与技术创新1.1 核心架构解析1.2 关键技术突破1.2.1 多粒度训练策略1.2.2 动态路由MoE 二、系统架构解析2.1 完整生成流程2.2 性能对比 三、实战部署指南3.1 环境配置3.2 基础推理代码3.3 高…...

TASK04【Datawhale 组队学习】构建RAG应用

目录 将LLM接入LangChain构建检索问答链运行成功图遇到的问题 langchain可以便捷地调用大模型&#xff0c;并将其结合在以langchain为基础框架搭建的个人应用中。 将LLM接入LangChain from langchain_openai import ChatOpenAI实例化一个 ChatOpenAI 类,实例化时传入超参数来…...

YOLOv11旋转目标检测Hrsc2016

from ultralytics import YOLOmodel YOLO(/kaggle/input/model-v11-obb/yolo11n-obb.pt) model.train(data/kaggle/input/hrscobb4/HRSC-YOLO/data.yaml, epochs30) 1使用的训练平台为Kaggle 数据集&#xff1a;HRSC的三种形式 一级分类&#xff1a;船 有水平框版本&…...

Debian重装系统后

安装配置java环境 手动安装 下载openJDK&#xff1a;openJDK 设置替代项 sudo update-alternatives --install /usr/bin/java java /opt/jdk-21.0.2/bin/java 1 sudo update-alternatives --install /usr/bin/javac javac /opt/jdk-21.0.2/bin/javac 1 sudo update-alternat…...

野火鲁班猫(arrch64架构debian)从零实现用MobileFaceNet算法进行实时人脸识别(四)安装RKNN Toolkit Lite2

RKNN Toolkit Lite2 是瑞芯微专为RK系列芯片开发的NPU加速推理API。若不使用该工具&#xff0c;计算任务将仅依赖CPU处理&#xff0c;无法充分发挥芯片高达6TOPS的NPU算力优势。 按照官方文档先拉一下官方代码库&#xff0c;然后通过whl文件安装&#xff0c;因为我是python3.1…...

ElasticSearch导读

ElasticSearch 简介&#xff1a;ElasticSearch简称ES是一个开源的分布式搜素和数据分析引擎。是使用Java开发并且是当前最流行的开源的企业级搜索引擎&#xff0c;能够达到近实时搜索&#xff0c;它专门设计用于处理大规模的文本数据和实现高性能的全文搜索。它基于 Apache Luc…...

【STM32】自定义打印函数

STM32 学习笔记&#xff1a;理解 my_printf 与 va_start 在嵌入式开发中&#xff0c;我们常常需要实现类似标准 C 中 printf 的调试输出功能。为了支持“任意数量参数”的传递&#xff0c;C 语言提供了对 可变参数&#xff08;variable arguments&#xff09; 的支持。其中&am…...

基于 STM32 的 PC ARGB 风扇控制器设计与实现

一、项目背景 最近购入的 X99 系列主板&#xff0c;没有风扇的 ARGB 彩灯接口&#xff0c;并且在 Ubuntu 系统上 4pin 的风扇接口调速也是非常的难用&#xff0c;sensor 扫描不到传感器&#xff0c;于是决定手搓一个风扇控制器&#xff0c;来实现转速自定义和彩灯控制。 我控制…...

【软件设计师】计算机网络考点整理

以下是软件设计师考试中 ​​计算机网络​​ 的核心考点总结&#xff0c;帮助您高效备考&#xff1a; ​​一、网络体系结构与协议​​ ​​OSI七层模型 & TCP/IP四层模型​​ 各层功能&#xff08;物理层-数据链路层-网络层-传输层-会话层-表示层-应用层&#xff09;对应协…...

在 Qt 中实现动态切换主题(明亮和暗黑)

目录 步骤 1&#xff1a;准备主题文件步骤 2&#xff1a;将 QSS 文件加入资源系统步骤 3&#xff1a;创建主题管理类步骤 4&#xff1a;在应用程序中切换主题步骤 5&#xff1a;处理自定义控件和动态资源步骤 6&#xff1a;保存用户主题偏好步骤 7&#xff1a;处理图片资源切换…...

JavaEE 初阶文件操作与 IO 详解

一、文件操作基础&#xff1a;File 类 作用&#xff1a;操作文件或目录&#xff08;创建、删除、获取信息&#xff09;。 核心方法&#xff1a; exists()&#xff1a;文件是否存在createNewFile()&#xff1a;创建新文件mkdir()&#xff1a;创建目录delete()&#xff1a;删除…...

基于Qt的app开发第十天

写在前面 笔者昨天刚刚收到课设的截止时间要求&#xff0c;距离写这篇博客的时间还有一个月&#xff0c;我从申请自命题课设到今天已经27天了&#xff0c;先用两周时间学Qt&#xff0c;然后就开始做这个项目&#xff0c;现在已经快把基础功能全部实现了。 目前的打算是完成基础…...

QT中信号和事件的区别

好的&#xff0c;简单来说&#xff0c;Qt 的信号&#xff08;Signal&#xff09;和事件&#xff08;Event&#xff09;虽然都用于组件间通信和交互&#xff0c;但它们的机制和用途是不同的&#xff1a; 1. 信号&#xff08;Signal&#xff09; 概念&#xff1a;信号是对象发出的…...

AUTOSAR图解==>AUTOSAR_SRS_PWMDriver

AUTOSAR PWM驱动模块详解 基于AUTOSAR 4.4.0 SRS 规范文档 目录 1. PWM驱动概述2. PWM驱动架构3. PWM驱动配置4. PWM驱动API接口5. PWM驱动状态管理6. PWM驱动典型应用场景7. 总结1. PWM驱动概述 AUTOSAR PWM驱动是AUTOSAR基础软件中的一个重要组件,属于微控制器抽象层(MCAL)…...

SQL数据处理流程

一、数据处理 1、数据清洗 对空值处理&#xff1a;删除/填充为0 -- 用 0 填充 NULL SELECT COALESCE(sales, 0) AS sales FROM orders;-- 删除含 NULL 的记录 DELETE FROM users WHERE email IS NULL; COALESCE(bonus, 0) 相当于IF(bonus IS NULL, 0, bonus)&#xff0c;当…...

Mysql差异备份与恢复

1.练习差异备份 差异备份&#xff1a;备份完全备份后&#xff0c;新产生的数据。 在192.168.88.50主机完成差异备份 步骤一&#xff1a;练习差异备份//周一完全备份 mysql> select * from test.one; --------------------- | name | age | sex | ------------------…...

目标检测 Lite-DETR(2023)详细解读

文章目录 迭代高级特征跨尺度融合高效的低层次特征跨尺度融合KDA&#xff1a;Key-aware Deformable Attention 论文翻译&#xff1a; CVPR 2023 | Lite DETR&#xff1a;计算量减少60%&#xff01;高效交错多尺度编码器-CSDN博客 DINO团队的 &#xff08;Lightweight Transfo…...

【Java学习方法】类变量

类变量 引出关键字&#xff1a;static 又名&#xff1a;静态变量&#xff0c;静态字段&#xff0c;类字段&#xff08;字段又名属性&#xff0c;成员方法&#xff09;&#xff0c;类属性 是什么&#xff1f; 供该&#xff08;同一个类&#xff09;的所有对象共享的变量 &am…...

智能手表为什么需要做 EN 18031 认证?

EN 18031 是欧盟针对电磁兼容性&#xff08;EMC&#xff09;中人体暴露于电磁场的安全要求制定的标准&#xff0c;全称为 《Electromagnetic compatibility (EMC) - Standards for protective measures against electromagnetic fields with regard to human exposure》&#x…...

什么是 Agent 的 Message

Messages 2.4.1 概述 什么是 Agent 的 Message&#xff1f; 当你和朋友聊天、在网上搜索信息或是对手机语音助手说“帮我查一下天气”时&#xff0c;其实你都在向某个“代理者(Agent)”发送一条“信息(Message)”。这里的“代理者”既可以是一个人&#xff0c;也可以是一个能执…...

如何用JAVA手写一个Tomcat

一、初步理解Tomcat Tomcat是什么&#xff1f; Tomcat 是一个开源的 轻量级 Java Web 应用服务器&#xff0c;核心功能是 运行 Servlet/JSP。 Tomcat的核心功能&#xff1f; Servlet 容器&#xff1a;负责加载、实例化、调用和销毁 Servlet。 HTTP 服务器&#xff1a;监听端口…...

WebRTC与RTSP|RTMP的技术对比:低延迟与稳定性如何决定音视频直播的未来

引言 音视频直播技术已经深刻影响了我们的生活方式&#xff0c;尤其是在教育、医疗、安防、娱乐等行业中&#xff0c;音视频技术成为了行业发展的重要推动力。近年来&#xff0c;WebRTC作为一种开源的实时通信技术&#xff0c;成为了音视频领域的重要选择&#xff0c;它使得浏览…...

COMPUTEX 2025 | 广和通创新解决方案共筑AI交互新纪元

5月20日至23日&#xff0c;广和通携多领域创新解决方案亮相2025年台北国际电脑展&#xff08;COMPUTEX 2025&#xff09;&#xff0c;台北南港展览馆#K0727a展位。此次展会&#xff0c;广和通围绕“Advancing Connectivity Intelligent Future”为主题&#xff0c;设置四大核心…...

COMPUTEX 2025 | 广和通率先发布基于MediaTek T930 平台的5G模组FG390

5月19日&#xff0c;全球领先的无线通信模组和AI解决方案提供商广和通率先发布基于MediaTek T930平台的5G模组FG390系列。FG390系列模组为以5G固定无线接入&#xff08;Fixed Wireless Access&#xff0c;FWA&#xff09;为代表的MBB终端产品而设计&#xff0c;将在CPE&#xf…...

Power Integrations 汽车电源管理方案:为汽车应用增加系统价值

在新能源汽车产业蓬勃发展的当下&#xff0c;高效的电源管理方案成为提升汽车性能与可靠性的关键。近期&#xff0c;Power Integrations 举办线上交流会&#xff0c;介绍了基于其 1700V InnoSwitch3-AQ 反激式开关 IC 的五款全新参考设计&#xff0c;旨在为 800V 纯电动汽车提供…...

汽车转向系统行业2025数据分析报告

汽车转向系统市场概况 2024年全球汽车转向系统市场规模约为2769.4亿元&#xff0c;预计到2031年将增长至3296.3亿元&#xff0c;年均复合增长率&#xff08;CAGR&#xff09;为2.5%。这一增长主要得益于汽车行业的持续发展以及转向系统技术的不断进步。 市场驱动因素 汽车转…...

Tiny C 编译器中,如何实现宏展开和头文件包含的预处理逻辑?

首先&#xff0c;预处理的主要功能包括宏展开、头文件包含、条件编译等。用户的问题主要集中在宏展开和头文件包含&#xff0c;所以需要分别考虑这两个部分。 关于宏展开&#xff0c;首先需要解析#define指令。编译器在预处理阶段需要维护一个符号表&#xff0c;用来存储宏的名…...