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

QT中的网络编程

Qt中的网络编程是通过封装操作系统的API进行实现的

C++标准库中,并没有提供网络编程的封装接口

进行网络编程时本质是在编写应用层代码,需要传输层提供支持

传输层最核心的协议为UDP/TCP

使用Qt网络编程的API时,需要在.pro文件中添加network模块

UDP Socket

Qt中提供进行udp编程的类主要有两个:QUdpSocket和QNetworkDatagram

QUdpSocket表示一个UDP的socket文件

名称

类型

说明

对标原生API

bind(const QHostAddress&,quint16)

方法

绑定指定的端口号

bind

receiveDatagram()

方法

返回

QNetworkDatagram,读取一个UDP数据报

recvfrom

writeDatagram(const QNetworkDatagram&)

方法

发送一个UDP数据报

sendto

readyRead

信号

在收到数据并准备就绪后触发

QNetworkDatagram表示一个UDP数据报

名称

类型

说明

QNetworkDatagram(const QByteArray&,const QHostAddress&,quint16)

构造函数

通过QByteArray,目标IP地址,目标端口号,构造一个UDP数据报,通常用于发送数据时

data()

方法

获取数据报内部持有的数据,返回QByteArray

senderAddress()

方法

获取数据并中包含的对端的IP地址

senderPort()

方法

获取数据报中包含的对端的端口号

例如:

实现基于UDP Socket写一个带有界面的Udp回显服务器

创建一个继承自Widget的文件

在ui界面创建一个list widget用于显示接收到的数据

在.pro文件中加入网络编程模块

在widget头文件中引入<QUdpSocket>头文件,若无法识别则编译一遍再看是否被识别

声明UdpSocket,将其作为成员变量

在构造函数进行实例化,将其挂到对象树,设置服务器窗口标题

在头文件声明处理函数,在构造函数进行信号槽连接

在构造函数绑定端口号

需要先进行信号槽绑定,再绑定端口号,因为绑定端口号后就能接收请求了,若端口号绑定完成后还未绑定信号槽就无法处理请求

在绑定端口号时,还需对返回值判断,避免端口号已经被绑定,导致绑定失败

实现槽函数,读取请求,构建响应,发送响应

在头文件中声明通过读取到的有效数据构建响应中有效数据的函数

实现

构建客户端,实现向服务器发送请求

新建文件继承自Widget,实现客户端

同样在.pro文件加上网络模块

在ui界面创建一个输入框用来接收有效数据,一个pushbutton,用于获取有效数据,构建数据报进行发送,构建一个listwidget用来显示发送的请求

将lineedit和pushbutton放在水平布局中--horizonlayout,再将水平布局放置在垂直布局中,将listwidget放置在垂直布局中

将垂直布局的拉伸系数设为5比1

再将lineedit和pushbutton的sizePolicy中的垂直策略设为expanding

在widget.cpp中定义目的IP,port

在widget.h中引入udpsocket作为成员变量,在构造函数进行定义,修改窗口标题

实现pushbutton的clicked的槽函数,来获取输入框数据,构建数据报进行发送

通过信号槽来处理服务器返回的响应

在widget头文件声明槽函数

在构造函数连接信号槽

实现槽函数

代码编写完成:

先启动服务器,再启动客户端

在客户端发送请求,能够收到响应,进行回显

:ffff是ipV6的环回ip

Qt中udp通信流程:

服务器:

    创建socket,通过connect,连接socket,readyRead信号,和处理对象,处理函数,当收到请求后触发readyRead信号,调用处理函数。再将socket绑定端口号,获取固定端口号收到的数据。

    收到数据后,通过

QNetworkDatagramrequestDatagram=socket->receiveDatagram()

来接收数据报,用

QString request=requestDatagram.data();

提取有效内容,对有效内容---请求进行处理后,构建响应

QNetworkDatagram responseDatagram(response.toUtf8(),requestDatagram.senderAddress(),requestDatagram.senderPort());

将响应通过

 socket->writeDatagram(responseDatagram);

发送给客户端

   客户端:

 创建socket,构建请求数据报,将请求数据报发送到目的服务器

QNetworkDatagram requestDatagram(text.toUtf8(),QHostAddress(SERVER_IP),PORT);

    //发送请求数据并

    socket->writeDatagram(requestDatagram);

接收响应,通过连接socket的readyRead信号,实现槽函数,接收响应读取有效内容

const QNetworkDatagramresponseDatagram=socket->receiveDatagram();

    QString response=responseDatagram.data();

Qt中无法将服务器放写在云服务器上,因为云服务器默认不带图形化界面,Qt程序需要依赖图形化界面来允许

但是可以通过Qt编写的客户端来连接Linux下连接云服务器写的服务器-----常见实现

TCP Socket

核心类是QTcpServer和QTcpSocket

QTcpServer用于监听端口,和获取客户端连接

名称

类型

说明

listen(const QHostAddress& ,quit16port)

方法

绑定指定的地址和端口号,并开始监听

nextPendingConnection()

方法

从系统中获取到一个已经建立好的tcp连接,返回一个QTcpSocket,表示这个客户端的连接,通过这个socket对象完成和客户端之间的通信

newConnection

信号

有新的客户端建立来连接好后触发

QTcpSocket用户客户端和服务器之间的数据交互

名称

类型

说明

readAll()

方法

读取当前接收缓冲区中的所有数据,返回QByteArray()对象

write(const QByteArray&)

方法

把数据写入socket中

deleteLater

方法

暂时把socket对象标记为无效,Qt会在下个事件循环中析构释放该对象

readyRead

信号

有效数据到达并准备就绪时触发

disconnected

信号

连接断开时触发

因为TCP时面向字节流的,所有读取数据和写入数据都是通过QByteArray

QByteArray用来表示一个字节数组,可以与QString进行相互转换

如:

使用QString的构造函数可以把QByteArray转换为QString

使用QString的toUtf8函数即可把QString转换为QByteArray

例如:

实现TCP回显服务器

在.pro文件引入网络模块,在widget头文件引入<QTcpServer>

在ui界面创建listWidget用于显示响应和请求

在构造函数设置窗口标题

在widget.h的类中声明QTcpServer作为成员变量,在构造函数进行初始化,并链入对象树

进行信号槽连接,声明槽函数,实现处理客户端连接

再将tcp设置绑定并监听,来用于获取新连接

实现获取连接后的槽函数,进行获取请求,进行响应,处理客户端断开连接

实现Tcp客户端

新建Widget文件

在.pro文件添加网络模块

在ui界面设计界面添加listwidget,pushbutton,lineEdit,设置布局

在widget.h声明QTcpSocket为成员变量,构造函数处进行初始化

在构造函数进行与服务器的连接

转到按钮的槽函数,实现请求的发送

在构造函数处绑定readyRead信号的槽函数,实现接收服务器的响应

先运行服务器,再启动客户端进行测试

退出客户端后也进行了对应处理

在Linux中多个客户端同时访问一个端口时,就只有一个客户端生效,因为服务端是单线程的,可以引入多线程,每个线程都单独处理一个客户端发送的请求

但是在qt中,上面代码能够处理多个客户端,无需为服务端引入多线程,因为问题的本质原因是在Linux等待客户端连接后,通过死循环来与客户端进行信息传输,若只有一个线程就只能进行一个死循环,而在qt中,无需循环,是通过信号槽来与客户端进行信息传输

HTTP Client

http是应用层协议,http协议的本身是基于Tcp协议实现的,使用一个Http的客户端/服务端,本质上是基于TCP Socket进行封装的

Qt仅提供了HTTP客户端,没有提供HTTP的服务端

主要类为:QNetworkAccessManager,QNetworkRequest,QNetworkReply

QNetworkAccessManager核心操作

方法

说明

get(const QNetworkRequest&)

发起一个HTTP GET请求,返回QNetworkReply对象

post(const QNetworkRequest,const QByteArray&)

发起一个HTTP POST请求,返回QNetworkReply对象

QNetworkRequest表示一个http请求---不包含请求正文

  如果需要发送一个带有body---请求正文的请求,需要使用QNetworkAccessManager的post方法中通过单独的参数传入

方法

说明

QNetworkRequest

通过URL构造一个HTTP请求

setHeader(QNetworkRequest::KnownHeaders header, const QVariant& value)

设置请求头

其中QNetworkRequest::KnownHeaders是一个枚举类型:

取值

说明

ContentTypeHeader

描述body的类型

ContentLengthHeader

描述body的长度

LocationHeader

用于重定向报文中指定的重定向地址(响应中使用)

CookieHeader

设值cookie

UserAgenHeader

设置User-Agent

QNetworkReply表示一个HTTP响应,这个类同时也是QIODevice的子类

方法

说明

error()

获取出错状态

errorString()

获取出错原因的文本

readAll()

读取响应body

header(QNetworkRequest::KnownHeaders header)

读取响应指定header的值

QNetworkReply还提供finished信号,会在客户端收到完整的响应数据之后触发

例:

创建一个继承自Widget的文件

在.pro文件添加网络模块

在ui界面创建一个listWidget用于显示请求和收到的响应内容,一个lineEdit用于输入url,一个按钮用于构建请求并发出

将响应的结果---HTML用QPlainTextEdit---纯文本用来表示,展示原始的html

若使用QTextEdit---富文本则会对htm进行解析渲染---支持标签的使用

将QNetworkAccessManager声明为类成员,在构造函数进行其初始化,和窗口标题定义,输入栏提示

转到pushButton的槽函数进行请求的发送,获取响应

此时就可以进行请求的发送

将plainedit替换为textedit后---支持富文本,并在输出响应时,采用setHtml来写入textedit后:

对标签进行解析

相关文章:

QT中的网络编程

Qt中的网络编程是通过封装操作系统的API进行实现的 C标准库中&#xff0c;并没有提供网络编程的封装接口 进行网络编程时本质是在编写应用层代码&#xff0c;需要传输层提供支持 传输层最核心的协议为UDP/TCP 使用Qt网络编程的API时&#xff0c;需要在.pro文件中添加network模块…...

0.5 像素边框实现

0.5 像素边框怎么实现 文章目录 0.5 像素边框怎么实现方法 1&#xff1a;使用 transform: scale() 缩放&#xff08;推荐&#xff09;方法 2&#xff1a;直接使用 0.5px 边框&#xff08;部分浏览器支持&#xff09;方法 3&#xff1a;使用 box-shadow 模拟边框方法 4&#xff…...

【Vagrant+VirtualBox创建自动化虚拟环境】Ansible测试Playbook

文章目录 Vagrant安装vagrant安装 VirtualBox如何使用 Ansible安装AnsiblePlaybook测试创建hosts文件创建setup.yml文件 Vagrant Vagrant是一个基于Ruby的工具&#xff0c;用于创建和部署虚拟化开发环境。它使用Oracle的开源VirtualBox虚拟化系统&#xff0c;使用 Chef创建自动…...

“连接世界的桥梁:深入理解计算机网络应用层”

一、引言 当你浏览网页、发送邮件、聊天或观看视频时&#xff0c;这一切都离不开计算机网络中的应用层&#xff08;Application Layer&#xff09;。 应用层是网络协议栈的最顶层&#xff0c;直接为用户的各种应用程序提供服务。它为用户进程之间建立通信桥梁&#xff0c;屏蔽了…...

Vulkan与OpenGL的对比

传统图形API与现代图形API 传统图形API指的是OpenGL/DirectX11这类简单易用、驱动托管严重的图形接口&#xff1b;而现代图形API则指的是Vulkan/Metal/DirectX12这类使用复杂、暴露更多底层硬件功能来显式控制的弱驱动设计的图形接口。 现代图形API与传统图形API相比&#xff…...

海外社交App的Web3革命:去中心化社交与Token经济实战指南

一、Web3社交的核心组件&#xff1a;从身份到经济的重构 去中心化身份&#xff08;DID&#xff09;技术栈&#xff1a;Ceramic IDX协议构建链上身份图谱代码示例&#xff1a;javascript// 创建DID const ceramic new CeramicClient() const did new DID({ provider: cerami…...

凯撒密码算法的实现

在密码学里&#xff0c;凯撒密码&#xff08;也叫恺撒密码、移位密码、恺撒代码或者恺撒移位&#xff09;是一种简单且广为人知的加密技术。它属于替换密码的一种&#xff0c;在这种加密方式中&#xff0c;明文中的每个字母都会被替换成字母表中往后移动固定位数的字母。例如&a…...

Chrome的插件扩展程序安装目录是什么?在哪个文件夹?

目录 前提 直接复制到浏览器中打开 Mac下Chrome extension 安装路径 最近换了mac pro用起来虽然方便&#xff0c;但是对常用的一些使用方法还是不熟悉。这不为了找到mac上chrome插件的安装路径在哪里&#xff0c;花费了不少时间。我想应用有不少像小编一样刚刚使用mac的小白…...

C++23中的std::forward_like:完美转发的增强

文章目录 一、背景与动机&#xff08;一&#xff09;完美转发的局限性&#xff08;二&#xff09;std::forward_like的提出 二、std::forward_like的设计与实现&#xff08;一&#xff09;基本语法&#xff08;二&#xff09;实现原理&#xff08;三&#xff09;与std::forward…...

AI与软件测试的未来:如何利用智能自动化改变测试流程

用工作流生成测试用例和自动化测试脚本&#xff01; 随着人工智能&#xff08;AI&#xff09;技术的迅猛发展&#xff0c;软件测试作为软件开发生命周期中的关键环节&#xff0c;正在经历一场前所未有的变革。传统的测试方法已经无法满足现代快速迭代和持续交付的需求&#xff…...

React Native 动态切换主题

React Native 动态切换主题 创建主题配置和上下文创建主题化高阶组件主应用组件主屏幕组件&#xff08;类组件形式&#xff09; 创建主题配置和上下文 // ThemeContext.jsimport React, { Component, createContext } from react;import { Appearance, AsyncStorage } from rea…...

得物 小程序 6宫格 分析

声明 本文章中所有内容仅供学习交流使用&#xff0c;不用于其他任何目的&#xff0c;抓包内容、敏感网址、数据接口等均已做脱敏处理&#xff0c;严禁用于商业用途和非法用途&#xff0c;否则由此产生的一切后果均与作者无关&#xff01; 逆向过程 部分python代码 if result …...

PocketFlow一个最小的Agent框架

1、背景 PocketFlow 2、使用 python 的版本需要python3.10 在cookbook中有如何使用的说明&#xff0c;如图所示 在tuils.py中修改代码 def call_llm(messages):# client OpenAI(api_keyos.environ.get("OPENAI_API_KEY", "your-api-key"))client Op…...

Objective-C Block 底层原理深度解析

Objective-C Block 底层原理深度解析 1. Block 是什么&#xff1f; 1.1 Block 的本质 Block 是 Objective-C 中的特殊对象&#xff0c;实现了匿名函数的功能 通过 isa 指针继承自 NSObject&#xff0c;可以响应&#xff08;如 copy、retain、release&#xff09;等内存管理方…...

AlDente Pro for Mac电脑 充电限制保护工具 安装教程【简单,轻松上手】

AlDente Pro for Mac电脑 充电限制保护工具 安装教程【简单&#xff0c;轻松上手】 AlDente Pro for Mac&#xff0c;是一款充电限制保护工具&#xff0c;是可以限制最大充电百分比来保护电池的工具。锂离子和聚合物电池&#xff08;如 MacBook 中的电池&#xff09;在40&…...

Linux systemd 从理论到实践:现代系统管理的核心工具

文章目录 引言&#xff1a;为什么需要 systemd&#xff1f;第一部分&#xff1a;systemd 核心理论1.1 systemd 的设计哲学1.2 核心组件1.3 单元文件&#xff08;Unit File&#xff09;结构 第二部分&#xff1a;实战操作指南2.1 基础命令2.2 服务管理高级操作2.3 日志管理&…...

分享一个移动端项目模板:React-Umi4-mobile

分享一个移动端项目模板&#xff1a;React-Umi4-mobile 大家好&#xff0c;今天想和大家分享一个我最近做的移动端项目模板 React-Umi4-mobile。 模板的主要内容 这个模板主要包括&#xff1a; 基于 Umi 4 框架使用了 antd-mobile 组件库配置了 px 自动转 vw&#xff08;基…...

Tailwind CSS 响应式设计解析(含示例)

本文内容&#xff1a; Tailwindcss V4 中如何使用响应式设计功能&#xff0c;包括默认断点、自定义断点、断点范围控制以及容器查询的各种技巧&#xff0c;帮助你在不离开 HTML 的前提下优雅构建响应式页面。 &#x1f31f; 默认断点用法&#xff08;移动优先&#xff09; Tail…...

ElasticSearch入门

1 elasticsearch概述 1.1 elasticsearch 简介 官网: https://www.elastic.co/ ElasticSearch是一个基于 Lucene 的搜索服务器&#xff0c;基于RESTful web接口。Elasticsearch是用Java开发的&#xff0c;开源的企业级搜索引擎。 Elastic官方宣布Elasticsearch进入Version 8…...

强化学习之基于无模型的算法之时序差分法

2、时序差分法(TD) 核心思想 TD 方法通过 引导值估计来学习最优策略。它利用当前的估计值和下一个时间步的信息来更新价值函数&#xff0c; 这种方法被称为“引导”&#xff08;bootstrapping&#xff09;。而不需要像蒙特卡罗方法那样等待一个完整的 episode 结束才进行更新&…...

【网络原理】TCP异常处理(二):连接异常

目录 一. 由进程崩溃引起的连接断开 二. 由关机引起的连接断开 三. 由断电引起的连接断开 四. 由网线断开引起的连接断开 一. 由进程崩溃引起的连接断开 在一般情况下&#xff0c;进程无论是正常结束&#xff0c;还是异常崩溃&#xff0c;都会触发回收文件资源&#xff0c;…...

[stm32] 4-1 USART(1)

文章目录 前言4-1 USARTUSART简介什么是USART?USART名字的含义&#xff1f;如何使用USART&#xff1f; USART的工作原理什么是串并转换&#xff1f;为什么要进行串并转换&#xff1f;移位寄存器串并行转换电路 USART寄存器组和完整框图 前言 本笔记内容&#xff0c;为本人依据…...

C++多线程与锁机制

1. 基本多线程编程 1.1 创建线程 #include <iostream> #include <thread>void thread_function() {std::cout << "Hello from thread!\n"; }int main() {std::thread t(thread_function); // 创建并启动线程t.join(); // 等待线程结束return 0; …...

【MCP Node.js SDK 全栈进阶指南】高级篇(4):自定义传输层开发

引言 在MCP(Model Context Protocol)应用开发中,传输层是连接客户端与服务器的关键环节,直接影响应用的性能、可靠性和扩展性。默认的传输方式虽然能满足基本需求,但在复杂场景下,自定义传输层能够为应用提供更高的灵活性和优化空间。本文将深入探讨MCP TypeScript-SDK中…...

当向量数据库与云计算相遇:AI应用全面提速

如果将AI比作一台高速运转的机器引擎&#xff0c;那么数据便是它的燃料。 然而&#xff0c;存储数据的燃料库--传统数据库&#xff0c;在AI时代的效率瓶颈愈发明显&#xff0c;已经无法满足AI对于数据的全新需求。 因此&#xff0c;向量数据库近年来迅速崛起。向量数据库通过…...

【2024-NIPS-版权】Evaluating Copyright Takedown Methods for Language Models

1.背景 目前 LLMs 在训练过程中使用了大量的受版权保护数据&#xff0c;这些数据会导致大模型记忆并生成与训练数据相似的内容&#xff0c;从而引发版权问题。随着版权所有者对模型训练和部署中的版权问题提起诉讼&#xff08;例如 Tremblay v. OpenAI, Inc. 和 Kadrey v. Met…...

【PyTorch动态计算图原理精讲】从入门到灵活应用

目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比二、实战演示环境配置要求核心代码实现案例1:基础计算图构建案例2:条件分支动态图案例3:循环结构动态图运行结果验证三、性能对比测试方…...

阿里巴巴Qwen3发布:登顶全球开源模型之巅,混合推理模式重新定义AI效率

今天凌晨&#xff0c;阿里巴巴正式开源了新一代通义千问大模型Qwen3&#xff0c;这一举措不仅标志着国产大模型技术的又一里程碑&#xff0c;更以“混合推理”“极致性能”“超低成本”三大核心优势&#xff0c;刷新了全球开源模型的竞争格局。Qwen3在多项评测中超越DeepSeek-R…...

5. 配置舵机ID(具身智能机器人套件)

1. 连接舵机 waveshare驱动器板使用9-12v供电Type-C连接电脑DVG连接一个舵机 2. 使用FT SCServo Debug软件 设置串口设置波特率&#xff08;默认1000000&#xff0c;100万&#xff09;打开串口编程界面修改ID 3. 依次修改所有舵机ID 分别使用waveshare驱动板连接舵机&…...

Nacos源码—2.Nacos服务注册发现分析四

大纲 5.服务发现—服务之间的调用请求链路分析 6.服务端如何维护不健康的微服务实例 7.服务下线时涉及的处理 8.服务注册发现总结 7.服务下线时涉及的处理 (1)Nacos客户端服务下线的源码 (2)Nacos服务端处理服务下线的源码 (3)Nacos服务端发送服务变动事件给客户端的源码…...

从Windows开发迁移到信创开发的指南:国产替代背景下的技术路径与实践

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家、CSDN平台优质创作者&#xff0c;高级开发工程师&#xff0c;数学专业&#xff0c;10年以上C/C, C#, Java等多种编程语言开发经验&#xff0c;拥有高级工程师证书&#xff1b;擅长C/C、C#等开发语言&#xff0c;熟悉Java常用开…...

从数据到决策:安科瑞EIoT如何让每一度电“清晰可见”?

安科瑞顾强 在能源管理迈向精细化与数字化的今天&#xff0c;安科瑞EIoT能源物联网平台以“数据驱动能源价值”为核心理念&#xff0c;融合物联网、云计算与大数据技术&#xff0c;打通从设备感知到云端决策的全链路闭环&#xff0c;助力工商业企业、园区、物业等场景实现用电…...

10.学习笔记-MyBatisPlus(P105-P110)

1.MyBatisPlus入门案例 &#xff08;1&#xff09;MyBatisPlus&#xff08;简称Mp&#xff09;是基于MyBatis框架基础上开发的增强型工具&#xff0c;目的是简化开发&#xff0c;提高效率。 &#xff08;2&#xff09;开发方式&#xff1a;基于MyBatis使用MyBatisPlus&#xff…...

LayerSkip: Enabling Early Exit Inference and Self-Speculative Decoding

TL;DR 2024 年 Meta FAIR 提出了 LayerSkip&#xff0c;这是一种端到端的解决方案&#xff0c;用于加速大语言模型&#xff08;LLMs&#xff09;的推理过程 Paper name LayerSkip: Enabling Early Exit Inference and Self-Speculative Decoding Paper Reading Note Paper…...

fastapi和flaskapi有什么区别

FastAPI 和 Flask 都是 Python 的 Web 框架&#xff0c;但设计目标和功能特性有显著差异。以下是它们的核心区别&#xff1a; 1. ‌性能与异步支持‌ ‌FastAPI‌ 基于 ‌Starlette‌&#xff08;高性能异步框架&#xff09;和 ‌Pydantic‌&#xff08;数据校验库&#xff09;…...

在 JMeter 中使用 BeanShell 获取 HTTP 请求体中的 JSON 数据

在 JMeter 中&#xff0c;您可以使用 BeanShell 处理器来获取 HTTP 请求体中的 JSON 数据。以下是几种方法&#xff1a; 方法一&#xff1a;使用前置处理器获取请求体 如果您需要在发送请求前访问请求体&#xff1a; 添加一个 BeanShell PreProcessor 到您的 HTTP 请求采样器…...

Go 1.25为什么要废除核心类型

​​​​​​​关于核心类型为什么要1.25里要移除&#xff0c;作者Robert在博客Goodbye core types - Hello Go as we know and love it!​​​​​​​里给了详细耐心的解答。 背景&#xff1a;Go 1.18 引入了泛型&#xff08;generics&#xff09;&#xff0c;带来了类型参数…...

flask中的Response 如何使用?

在 Flask 中&#xff0c;Response 对象用于生成 HTTP 响应并返回给客户端。以下是其常见用法及示例&#xff1a; 1. 直接返回字符串或 HTML 视图函数返回的字符串会被自动包装为 Response 对象&#xff0c;默认状态码为 200&#xff0c;内容类型为 text/html&#xff1a; app…...

基于SpringAI实现简易聊天对话

简介 本文旨在记录学习和实践 Spring AI Alibaba 提供的 ChatClient 组件的过程。ChatClient 是 Spring AI 中用于与大语言模型&#xff08;LLM&#xff09;进行交互的高级 API&#xff0c;它通过流畅&#xff08;Fluent&#xff09;的编程接口&#xff0c;极大地简化了构建聊天…...

STM32单片机入门学习——第49节: [15-2] 读写内部FLASH读取芯片ID

写这个文章是用来学习的,记录一下我的学习过程。希望我能一直坚持下去,我只是一个小白,只是想好好学习,我知道这会很难&#xff0c;但我还是想去做&#xff01; 本文写于&#xff1a;2025.04.29 STM32开发板学习——第49节: [15-2] 读写内部FLASH&读取芯片ID 前言开发板说…...

第14讲:科研图表的导出与排版艺术——高质量 PDF、TIFF 输出与投稿规范全攻略!

目录 📘 前言:导出,不只是“保存”! 🎯 一、你需要掌握的导出目标 🖼️ 二、TIFF / PNG 导出规范(适用于投稿) 🧲 三、PDF 矢量图导出(排版首选) 🧩 四、强烈推荐组合:showtext + Cairo 🧷 五、多个图的组合导出技巧 🧪 六、特殊投稿需求处理 �…...

SRIO IP调试问题记录(ready信号不拉高情况)

问题&#xff1a;调试过程中遇到有时写入数据后数据不发送&#xff0c;并且ready信号在写入一定数据后一直拉低的情况&#xff08;偶发&#xff0c;不是每次必然出现&#xff09;。buf空间设置为16时&#xff0c;写入15包数据&#xff0c;写完第16包包头后&#xff0c;ready信号…...

使用DDR4控制器实现多通道数据读写(十)

一、本章概述 本章节对目前单通道的读写功能进项测试&#xff0c;主要验证读写的数据是否正确&#xff0c;并观察该工程可以存储的最大容量。通过空满信号进行读写测试&#xff0c;根据ila抓取fifo和ddr4全部满的时刻&#xff0c;可以观察到最大容量。再通过debug逻辑可以测试读…...

从 BERT 到 GPT:Encoder 的 “全局视野” 如何喂饱 Decoder 的 “逐词纠结”

当 Encoder 学会 “左顾右盼”&#xff1a;Decoder 如何凭 “单向记忆” 生成丝滑文本&#xff1f; 目录 当 Encoder 学会 “左顾右盼”&#xff1a;Decoder 如何凭 “单向记忆” 生成丝滑文本&#xff1f;引言一、Encoder vs Decoder&#xff1a;核心功能与基础架构对比1.1 本…...

探寻软件稳定性的奥秘

在软件开发的广袤领域中&#xff0c;软件的稳定性宛如基石&#xff0c;支撑着整个软件系统的运行与发展。《发布&#xff01;软件的设计与部署》这本书的第一部分&#xff0c;对软件稳定性进行了深入且全面的剖析&#xff0c;为软件开发人员、架构师以及相关从业者们提供了极具…...

Reverse-WP记录9

前言 之前写的&#xff0c;一直没发&#xff0c;留个记录吧&#xff0c;万一哪天记录掉了起码在csdn有个念想 1.easyre1 32位无壳elf文件 shiftF12进入字符串&#xff0c;发现一串数字&#xff0c;双击进入 进入main函数 int __cdecl main(int argc, const char **argv, const…...

日常开发小Tips:后端返回带颜色的字段给前端

一般来说&#xff0c;展示给用户的字体格式&#xff0c;都是由前端控制&#xff0c;展现给用户&#xff1b; 但是当要表示某些字段的数据为异常数据&#xff0c;或者将一些关键信息以不同颜色的形式呈现给用户时&#xff0c;而前端又不好判断&#xff0c;那么就可以由后端来控…...

partition_pdf 和chunk_by_title 的区别

from unstructured.partition.pdf import partition_pdf from unstructured.chunking.title import chunk_by_titlepartition_pdf 和 chunk_by_title 初看有点像&#xff0c;都在"分块"&#xff0c;但是它们的本质完全不一样。 先看它们核心区别 partition_pdfchun…...

JAVA-使用Apache POI导出数据到Excel,并把每条数据的图片打包成zip附件项

最近项目要实现一个功能&#xff0c;就是在导出报表的时候 &#xff0c;要把每条数据的所有图片都要打包成zip附件在excel里一起导出。 1. 添加依赖 <dependency><groupId>org.apache.poi</groupId><artifactId>poi</artifactId><version>…...

前端——CSS1

一&#xff0c;概述 CSS&#xff08;Cascading Style Sheets&#xff09;&#xff08;级联样式表&#xff09; css是一种样式表语言&#xff0c;为html标签修饰定义外观&#xff0c;分工不同 涉及&#xff1a;对网页的文字、背景、宽、高、布局进行修饰 分为内嵌样式表&…...