- 博客(247)
- 收藏
- 关注
原创 安装JMeter
本文介绍了JMeter的基本使用指南:首先下载并解压Apache JMeter,提供两种启动方式(直接运行bat文件或通过命令行)。重点说明了配置环境变量的步骤,并推荐命令行启动方式。随后介绍了两个基础配置:修改界面语言为中文(通过编辑bin目录下的配置文件)和放大页面显示的操作方法。全文提供了从安装到基本设置的完整指引。
2026-05-30 21:04:47
239
原创 博客系统自动化测试实战总结
总结了基于Selenium+Python的博客系统UI自动化测试实践。项目覆盖登录、博客列表、详情和编辑四大模块,采用模块化设计思路,包含公共工具类封装、单例驱动管理、智能截图命名等关键技术。测试框架通过ChromeDriverManager实现自动驱动管理,利用反射机制优化错误定位,采用eager加载策略提升执行效率。测试流程遵循登录→状态保持→页面测试的顺序,最终生成带时间戳的测试报告。介绍了项目结构、核心函数实现及常见问题解决方案
2026-05-30 15:37:11
180
原创 腾讯云服务器端口开放完全指南
介绍了在腾讯云服务器上开放端口的双重配置方法。首先需要在腾讯云安全组中设置入站规则,这是第一道网络访问控制;其次要在系统防火墙(如firewalld/ufw/iptables)中配置放行规则。文章提供了具体操作步骤、常见端口配置示例,并强调了安全最佳实践,包括最小权限原则和IP限制。同时给出了端口验证方法和常见问题排查指南,帮助用户确保服务正常访问。
2026-05-14 13:46:49
459
原创 HTTP协议:初识
HTTP协议核心要点摘要 HTTP协议是客户端与服务器通信的基础,定义了请求响应机制和数据传输格式。核心特点包括无连接、无状态、基于TCP协议。URL作为资源标识符,包含协议、地址、路径等组件,对应服务器上的文件资源。HTTP请求由请求行、请求头、空行和请求体组成,通过空行分隔报头与有效载荷,Content-Length确定数据长度。URL编码(urldecode/urlencode)处理特殊字符,确保传输准确性
2026-05-14 11:09:55
783
原创 Llinux - 项目部署:从代码到可交付服务的完整指南
《Linux守护进程(Daemon)完全指南》介绍了将普通程序转化为守护进程的关键步骤:通过setsid()和fork()脱离终端控制,使用chdir(“/”;)重定位工作目录,重定向标准IO到/dev/null。解析了Makefile的部署思想,包括编译服务器/客户端、创建标准化目录结构(bin/、conf/、log/)以及打包发布流程。讲解了生产环境运行守护进程的方法,强调项目部署是从源码到系统服务的完整工程化流程,涉及启动、停止、状态查看等运维操作。
2026-05-13 21:25:26
540
1
原创 网络计算器:理解序列化与反序列化(下)
介绍了网络计算器项目中TCP服务器的实现细节,分析了TcpServer.hpp的多进程并发模型。服务器采用双fork技巧创建孤儿进程处理客户端请求,父进程专注接收新连接。展示了三层架构设计(业务层、协议层、服务器层)如何通过lambda回调实现解耦,并对比了客户端与服务端的实现差异。关键点包括:使用unique_ptr管理资源、多进程并发处理、文件描述符关闭策略以及孤儿进程自动回收机制。
2026-05-13 13:38:36
396
原创 网络计算器:理解序列化与反序列化(中)
介绍了网络计算器项目中Socket通信的核心实现,重点解析了序列化与反序列化机制。文章分为三部分:1)Socket.hpp使用模板方法模式封装TCP通信流程,通过纯虚函数实现多态;2)Protocol.hpp通过JSON实现结构化数据的序列化/反序列化,并设计自定义协议解决TCP粘包问题;3)Cal.hpp作为纯粹的业务层,处理计算逻辑并返回响应结果。项目亮点包括:使用JSON-CPP库处理数据转换,设计完善的错误码体系,以及通过累积缓冲区处理流式数据。
2026-05-12 21:10:32
1650
原创 网络计算器:理解序列化与反序列化(上)
基于C++17的网络计算器项目,采用C/S架构实现。项目包含服务器端(处理运算请求)和客户端(发送表达式并接收结果),通过序列化/反序列化技术实现数据传输。核心模块包括:网络地址转换(InetAddr)、线程安全锁(Mutex)、策略模式日志系统(Log)、Socket抽象层和自定义协议编解码(Protocol)。项目采用分层设计,包含基础设施层(Common)、网络层、协议层和业务层,通过RAII技术管理资源,确保线程安全。日志系统支持控制台和文件输出,采用策略模式实现灵活扩展。
2026-05-12 19:40:26
383
原创 Linux - 【理解进程组、会话与作业控制】
Linux系统中进程组、会话和作业控制的核心概念。进程组是协同完成任务的进程集合,会话则是进程组的容器,每个会话关联一个控制终端。前台进程组独占终端输入,而后台进程组不影响Shell操作。介绍了进程组生命周期、会话创建方法(setsid)、控制终端机制,实验演示了作业控制命令(jobs/fg/bg)的使用场景。这些机制共同构成了Linux多任务管理的基础,解释了为何前台任务会卡;终端而后台任务不会的现象。
2026-05-12 15:35:04
768
原创 服务端高并发分布式结构演进之路
分布式系统是单机性能不足时的扩展方案,而非技术炫耀。文章通过电商网站架构演进七阶段(单机→应用数据分离→集群→读写分离→缓存→垂直分库→微服务),揭示技术随业务增长而升级的必然性。核心观点:1)业务需求驱动技术选型;2)分布式引入复杂度,需权衡利弊;3)Redis作为内存数据库,在分布式环境下发挥缓存/消息队列等作用,与MySQL形成互补。
2026-05-10 19:58:37
588
原创 JSON 序列化与反序列化 —— 用 Jsoncpp 打造自己的网络协议
介绍了在网络通信中使用JSON进行结构化数据序列化和反序列化的方法。讲解了Jsoncpp库的安装与使用,包括四种JSON序列化方式(toStyledString、FastWriter、StyledWriter、StreamWriter)和反序列化方法(Json::Reader)。通过计算器协议实例展示了如何设计网络通信协议,并提供了Json::Value的常用操作指南。文章最后介绍了粘包处理、错误检查和性能优化等注意事项,为C++开发者提供了完整的JSON网络通信解决方案。
2026-05-10 14:51:44
467
原创 应用层【协议再识/序列化与反序列化】
网络通信中必须引入序列化/反序列化的核心原因在于TCP字节流特性带来的粘包/拆包问题。文章首先分析了TCP字节流导致read()读取数据存在边界不确定的问题,指出应用层必须自行定义报文边界。其次阐述了协议的本质是结构化数据的约定,对比了纯文本协议和结构化协议的优劣,强调序列化方案在跨平台、跨语言通信中的必要性。解释了为何不能直接传输二进制结构体,包括内存对齐、大小端和跨语言兼容性问题。最后通过TCP缓冲区机制说明了全双工通信原理,指出序列化/反序列化是解决网络通信数据完整性和一致性的最佳实践。
2026-05-09 20:16:16
643
原创 TCP Server 业务扩展实战:从 Echo 到远程命令执行与词典翻译
通过回调函数机制实现TCP服务器的业务解耦。首先分析了原始EchoServer的局限性,提出通过std::function定义回调类型func_t,支持普通函数、Lambda和成员函数三种绑定方式。重点讲解了使用std::bind绑定成员函数的方法,并改造TcpServer类使其支持回调注入。随后展示了两个业务实现:Command类通过白名单机制安全执行命令,Dict类实现英汉词典翻译。最后对比了解耦架构的优势,强调popen()执行命令时的安全注意事项。
2026-05-09 13:00:54
319
原创 TCP Echo Server 深度解析:从单进程到线程池的演进之路(下)
本文介绍了TCP Echo服务器的四种演进版本:1.0单进程版本仅用于演示,无法处理并发连接;1.1多进程版本通过两次fork创建孤儿进程处理请求,避免僵尸进程;1.2多线程版本利用线程共享资源的优势,通过静态成员函数解决线程入口问题;1.3线程池版本适合处理短服务请求,预先创建线程提高效率。对比了进程和线程的资源开销、切换成本等特性,并提供了完整的代码实现,包括服务器初始化、服务逻辑和客户端交互流程。最后指出线程池适合短连接服务,而长连接仍需多线程模型。
2026-05-09 10:40:34
390
原创 TCP Echo Server 深度解析:从单进程到线程池的演进之路(中)
TCP Echo服务器的实现逻辑,介绍了从单进程到线程池的演进过程。首先介绍了Init()函数的三个关键步骤:socket()创建通信端点、bind()绑定地址端口、listen()设置监听状态。随后探讨了accept()函数的本质和telnet工具的使用,并通过netstat命令分析TCP连接状态。文中还提供了完整的代码实现,包括Cond条件变量、InetAddr网络地址转换、Log日志系统、Mutex互斥锁、Thread线程类以及ThreadPool线程池等重要组件。
2026-05-09 10:20:35
598
原创 TCP Echo Server 深度解析:从单进程到线程池的演进之路(上)
介绍了网络编程中的公共基础设施设计,重点解析了Common.hpp的实现细节。通过ExitCode枚举替代硬编码错误码,提升可读性与维护性;采用NoCopy类(C++11的=delete语法)优雅禁止服务器拷贝,避免资源管理问题;使用CONV宏简化地址类型转换。同时探讨了InetAddr类对网络地址的封装,支持多种构造场景(如INADDR_ANY监听所有网卡),并对比了C++98与C++11禁止拷贝的差异,强调Mixin设计模式的简洁性。整体设计注重类型安全、语义清晰与代码复用。
2026-05-09 09:59:26
372
原创 网络编程必备:IPv4地址转换函数
介绍了网络编程中IP地址字符串与二进制格式(in_addr)的转换方法。传统函数inet_aton和inet_addr用于字符串转二进制,但后者存在缺陷;现代函数inet_pton支持IPv4/IPv6且更安全。反向转换中,inet_ntoa因使用静态缓冲区存在线程安全问题,推荐使用线程安全的inet_ntop。建议新项目统一使用inet_pton和inet_ntop,维护旧代码时需注意线程安全问题,并为地址转换预留足够缓冲区空间。
2026-05-06 13:32:28
379
原创 socket 编程进阶:基于回调函数的英译汉服务器
Linux下UDP Socket编程的实现方法,重点展示了翻译服务器的开发过程。文章对比了两种实现方式:Demo1采用硬编码业务逻辑的回显服务器,而Demo2通过回调函数实现网络层与业务层解耦,支持英译汉功能。核心内容包括:1)网络地址封装类InetAddr简化字节序转换;2)字典类Dict实现文件加载和单词翻译;3)UdpServer类通过std::function支持回调注入;4)展示了如何通过Lambda表达式将翻译业务注入网络层。这种架构设计使网络层代码可复用,
2026-05-05 14:11:06
338
原创 算法中 cin/cout 超时?聊聊它与 printf/scanf 的性能差异
C++中cin/cout比scanf/printf慢的主要原因包括:1)默认与C标准I/O同步导致额外开销;2)cin与cout绑定导致频繁缓冲区刷新;3)endl强制刷新缓冲区。通过关闭同步(ios::sync_with_stdio(false))、解除绑定(cin.tie(nullptr))和使用'\n'代替endl,可以显著提升性能,使cin/cout接近甚至超越scanf/printf的速度。在算法竞赛中,建议进行这些优化以提高输入输出效率。
2026-04-30 15:46:25
369
1
原创 Linux UDP Socket 编程入门:Echo Server/Client实现
1.服务端流程:创建socket→绑定端口→循环收发数据 2.客户端流程:创建socket→(可选绑定)→直接收发数据
2026-04-29 21:02:17
436
原创 网络命令入门:Ping、Netstat 和 Pidof 详解
介绍了三个实用的Linux网络命令:ping用于测试网络连通性,通过发送ICMP包检测主机可达性和延迟;netstat查看网络状态,可列出监听端口、连接信息和占用进程;pidof通过进程名快速查找PID,比传统ps命令更简洁高效。
2026-04-28 17:00:00
250
原创 【Socket编程预备知识】
网络通信的本质是跨主机进程间通信,通过IP地址定位主机,端口号标识进程。IP+端口号组成套接字(Socket),形成通信端点。知名端口(0-1023)用于标准服务,动态端口(1024-65535)分配给客户端程序。传输层协议TCP/UDP通过源/目的端口实现进程寻址,TCP提供可靠连接,UDP提供无连接服务。网络字节序采用大端模式,编程时需进行主机/网络字节序转换。Socket API提供跨平台网络编程接口,使用sockaddr结构统一处理不同协议地址。
2026-04-28 15:08:31
736
原创 网络传输基本流程:数据在网络中是如何“旅行”的?
讲解了计算机网络通信的核心原理。首先通过局域网通信实例,阐释了MAC地址识别、数据碰撞等基础概念;然后剖析了数据包的封装与分用过程,说明协议分层的重要性;接着对比了IPv4与IPv6地址体系,解释了NAT技术的作用;探讨了IP地址与MAC地址的协同工作机制,指出网络架构发展需要兼顾技术创新与兼容性。
2026-04-27 10:00:00
380
原创 Linux线程同步与互斥(六):线程安全、可重入与死锁
多线程编程中的关键概念。线程安全指多线程访问时数据不会损坏,可通过加锁实现;可重入函数需避免使用全局变量和静态变量。死锁发生的四个必要条件被详细分析,并提出破坏循环等待、固定加锁顺序等解决方案。STL容器默认非线程安全,需手动加锁;智能指针中shared_ptr的引用计数是原子操作但对象访问仍需同步。。
2026-04-27 09:00:00
467
原创 线程安全的单例模式
单例模式确保程序运行期间某个类只有一个实例存在,常用于线程池、日志系统等场景。实现单例需解决两个核心问题:阻止用户随意创建对象(通过私有化构造函数)和确保唯一实例的创建(通过静态方法)。存在饿汉式(启动时创建,线程安全但启动慢)和懒汉式(首次调用时创建,需处理线程安全问题)两种实现方式。懒汉模式推荐使用双重检查锁定(DCL)来兼顾线程安全和性能,避免重复创建实例。
2026-04-26 13:46:06
789
原创 Linux线程同步与互斥(五):线程池的全面实现
介绍了线程池的实现原理及其核心组件。线程池通过预先创建一组工作线程,避免了频繁创建销毁线程的开销。关键实现包括:1) 线程封装类处理线程生命周期;2) 互斥锁和条件变量实现线程同步;3) 任务队列管理机制;4) 工作线程的主循环逻辑,通过条件变量等待任务或终止信号。线程池能有效控制系统资源使用,提高任务处理效率,并通过生产者-消费者模型实现任务解耦。
2026-04-26 11:28:41
615
原创 Linux线程同步与互斥(四):日志系统与策略模式
介绍了一个线程安全的日志系统实现方案。采用策略模式支持控制台和文件两种输出方式,利用RAII机制自动管理资源。核心设计包括:1) 通过互斥锁保证多线程安全;2) 使用策略模式灵活切换输出目标;3) 借助RAII在语句结束时自动输出完整日志;4) 通过宏自动捕获文件名和行号。日志格式包含时间戳、等级、进程ID、源文件和行号等信息。
2026-04-25 12:39:18
590
原创 Linux线程同步与互斥(三):POSIX信号量与环形队列生产者消费者模型
信号量是多线程编程中管理共享资源的高效同步机制。它通过计数器记录可用资源数量,支持P(预订)和V(释放)原子操作,相比互斥锁能实现更细粒度的并发控制。典型应用场景包括环形缓冲区的生产者-消费者模型,通过空位信号量(blank_sem)和数据信号量(data_sem)的配合,既保证了线程安全又提高了吞吐量。当资源耗尽时自动阻塞线程,资源释放后唤醒等待线程,这种机制有效解决了多线程环境下的资源竞争问题。POSIX标准提供了sem_init/wait/post等接口实现信号量。
2026-04-21 21:44:29
489
1
原创 Linux线程同步与互斥(二):条件变量、生产者消费者模型与信号量
介绍了线程同步中的条件变量机制及其应用。首先介绍互斥锁仅能保证数据安全但无法控制线程执行顺序,进而引出条件变量的必要性。讲解了条件变量的核心功能、常用接口(初始化、等待、唤醒、销毁)及其底层实现原理,强调pthread_cond_wait必须与互斥锁配合使用以避免竞态条件。通过生产者消费者模型的代码示例,展示了如何利用条件变量实现线程间协同工作,包括阻塞队列的设计要点:双重条件检测(队列空/满)、等待唤醒机制、避免虚假唤醒的while循环策略。
2026-04-20 22:00:26
482
原创 QT初识【创建项目+对象树】
介绍了Qt项目的核心文件结构和编程要点。从.pro工程文件的配置解析,到widget.h头文件的类声明规范,再到main.cpp的入口逻辑和widget.cpp的实现细节,讲解了Qt应用程序的开发框架。阐述了QString的设计原理、对象树的内存管理机制、界面控件创建方式(图形化与代码两种方法),以及Qt特有的编码规范和快捷键使用技巧。分析了Qt避免内存泄漏的机制,包括Parent指针的作用和对象树的工作原理,并提供了解决中文乱码问题的实用方案。
2026-04-20 20:59:36
441
原创 理解互斥锁:从硬件原子指令到临界区保护
线程切换通过寄存器上下文保存实现数据私有性,每个线程都感觉自己独占CPU。锁的实现分为硬件级(关中断)和软件级(原子指令),现代OS主要采用后者。xchgb原子交换指令是关键,它能保证操作的不可分割性、所有权转移和内存可见性。锁机制的核心在于:1)单条指令的原子性;2)锁凭证的私有性;3)修改对所有CPU核心的可见性。
2026-04-19 20:05:07
219
原创 Linux线程同步与互斥(一):互斥量与锁的理解
介绍了多线程编程中的资源共享与互斥问题。通过售票系统案例,分析了线程并发操作共享变量导致的数据不一致问题,如票数减为负数等。关键问题在于判断和修改(ticket--)操作之间的时间窗口,以及ticket--本身不是原子操作。介绍了互斥锁(mutex)的解决方案,包括锁的初始化、加锁、解锁和销毁操作,并提供了C和C++两种实现方式。通过CPU的原子交换指令保证锁的原子性。展示了如何封装互斥锁类,实现RAII风格的资源管理。
2026-04-19 17:26:52
669
原创 解决 Ubuntu 下 man 手册找不到 pthread 函数的问题
在Linux C多线程编程中,即使包含pthread.h头文件,使用man命令查询pthread_mutex_t等函数时可能提示无手册条目。这是因为Ubuntu默认未安装POSIX线程库文档,这些内容被单独打包在manpages-posix-dev中。解决方法是通过sudo apt install manpages-posix-dev安装该包,即可获取线程、互斥量等POSIX接口的完整手册。安装后可通过man 3 pthread_mutex_t等命令查询。
2026-04-19 13:38:51
210
原创 Linux 【线程封装】
介绍了Linux系统下轻量级进程和线程的实现原理及封装方法。首先通过clone系统调用演示了创建轻量级进程的过程,重点讲解了栈空间分配和资源共享标志的设置。然后分析了mmap内存映射机制及其在进程间通信中的应用,探讨了线程栈空间的共享特性。展示了一个基于pthread的C++线程封装类,包括线程创建、分离、终止等功能的实现,以及命名空间、模板等现代C++特性的应用。
2026-04-18 21:53:32
492
原创 Linux线程(三): 线程控制:退出、等待、分离
介绍了Linux系统中线程的基本概念和操作方式。主要内容包括:1. 线程标识获取方法,区分用户态线程ID(pthread_t)和内核轻量级进程ID(LWP);2. 线程创建函数pthread_create的使用方法及参数传递技巧;3. 线程等待(pthread_join)和终止的三种方式(return/pthread_exit/pthread_cancel);4. 分离线程的概念和使用场景;5. 多线程编程中的竞态条件问题及解决方案
2026-04-16 17:26:02
408
原创 Linux线程(二): 线程控制之创建
阐述了线程相关核心概念与实现机制。首先从硬件层面解析了TLB(快表)的工作原理及其在地址转换中的加速作用,深入剖析了缺页中断的触发条件与处理流程。其次,对比了进程与线程的资源共享特性,重点讲解了POSIX线程库的使用方法,包括线程创建、属性设置等关键API。针对不同应用场景,文章详细区分了计算密集型和I/O密集型任务的特点及线程配置策略,并揭示了Linux线程的本质实为轻量级进程(LWP)。最后,通过实例代码演示了多线程编程实践,同时指出了线程过多可能导致的问题及优化方向。
2026-04-14 15:34:15
337
空空如也
空空如也
TA创建的收藏夹 TA关注的收藏夹
TA关注的人
RSS订阅