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

域名信息优化的近义词

域名信息,优化的近义词,可以做系统同步时间的网站,web前端开发规范手册JQHttpServer是基于Qt开发的轻量级HTTP/HTTPS服务器。 GitHub地址:GitHub - 188080501/JQHttpServer: 基于Qt开发的轻量级HTTP/HTTPS服务器 不愧是大神写的,用起来确实方便。 下面粗略介绍 jqhttpserver.h 的内容先看源代码: /*This fil…

JQHttpServer是基于Qt开发的轻量级HTTP/HTTPS服务器。

GitHub地址:GitHub - 188080501/JQHttpServer: 基于Qt开发的轻量级HTTP/HTTPS服务器
不愧是大神写的,用起来确实方便。

下面粗略介绍 jqhttpserver.h 的内容先看源代码:
 

/*This file is part of JQLibraryCopyright: JasonContact email: 188080501@qq.comGNU Lesser General Public License UsageAlternatively, this file may be used under the terms of the GNU LesserGeneral Public License version 2.1 or version 3 as published by the FreeSoftware Foundation and appearing in the file LICENSE.LGPLv21 andLICENSE.LGPLv3 included in the packaging of this file. Please review thefollowing information to ensure the GNU Lesser General Public Licenserequirements will be met: https://www.gnu.org/licenses/lgpl.html andhttp://www.gnu.org/licenses/old-licenses/lgpl-2.1.html.
*/#ifndef JQLIBRARY_INCLUDE_JQHTTPSERVER_H_
#define JQLIBRARY_INCLUDE_JQHTTPSERVER_H_#ifndef QT_NETWORK_LIB
#   error("Please add network in pro file")
#endif#ifndef QT_CONCURRENT_LIB
#   error("Please add concurrent in pro file")
#endif// C++ lib import
#include <functional>// Qt lib import
#include <QVector>
#include <QFuture>
#include <QMutex>
#include <QUrl>
#ifndef QT_NO_SSL
#   include <QSslCertificate>
#   include <QSslSocket>
#endif#include "jqdeclare.hpp"class QIODevice;
class QThreadPool;
class QHostAddress;
class QTimer;
class QImage;
class QTcpServer;
class QLocalServer;
class QSslKey;
class QSslConfiguration;namespace JQHttpServer
{class Session: public QObject
{Q_OBJECTQ_DISABLE_COPY( Session )public:Session( const QPointer<QIODevice> &socket );~Session();void setHandleAcceptedCallback(const std::function<void(const QPointer<Session> &)> &callback) { handleAcceptedCallback_ = callback; }QPointer<QIODevice> ioDevice() { return ioDevice_; }QString requestSourceIp() const;QString requestMethod() const;QString requestUrl() const;QString requestCrlf() const;QMap<QString, QString> requestHeader() const;QByteArray requestBody() const;QString requestUrlPath() const;QStringList requestUrlPathSplitToList() const;QMap<QString, QString> requestUrlQuery() const;int replyHttpCode() const;qint64 replyBodySize() const;#ifndef QT_NO_SSLQSslCertificate peerCertificate() const;
#endifvolatile int m_isSafeExit;public slots:void replyText(const QString &replyData, const int &httpStatusCode = 200);void replyRedirects(const QUrl &targetUrl, const int &httpStatusCode = 200);void replyJsonObject(const QJsonObject &jsonObject, const int &httpStatusCode = 200);void replyJsonArray(const QJsonArray &jsonArray, const int &httpStatusCode = 200);void replyFile(const QString &filePath, const int &httpStatusCode = 200);void replyFile(const QString &fileName, const QByteArray &fileData, const int &httpStatusCode = 200);void replyImage(const QImage &image, const QString &format = "PNG", const int &httpStatusCode = 200);void replyImage(const QString &imageFilePath, const int &httpStatusCode = 200);void replyBytes(const QByteArray &bytes, const QString &contentType = "application/octet-stream", const int &httpStatusCode = 200);void replyOptions();private:void inspectionBufferSetup1();void inspectionBufferSetup2();void onBytesWritten(const qint64 &written);void waitWorkingForFinished();private:static QAtomicInt remainSession_;QPointer<QIODevice>                                   ioDevice_;std::function<void( const QPointer<Session> & )>      handleAcceptedCallback_;QSharedPointer<QTimer>                                autoCloseTimer_;QByteArray receiveBuffer_;QString                  requestSourceIp_;QString                  requestMethod_;QString                  requestUrl_;QString                  requestCrlf_;QByteArray               requestBody_;QMap<QString, QString> requestHeader_;bool   headerAcceptedFinished_  = false;bool   contentAcceptedFinished_ = false;qint64 contentLength_           = -1;int        replyHttpCode_ = -1;QByteArray replyBuffer_;qint64     replyBodySize_ = -1;qint64                      waitWrittenByteCount_ = -1;QSharedPointer<QIODevice> replyIoDevice_;
};class AbstractManage: public QObject
{Q_OBJECTQ_DISABLE_COPY( AbstractManage )public:AbstractManage(const int &handleMaxThreadCount);virtual ~AbstractManage();void setMainObject(QObject *obj) { m_mainObj = obj; }QObject* getMainObject() { return m_mainObj; }void setHttpAcceptedCallback(const std::function<void(const QPointer<Session> &session,QObject *mainObj)> &httpAcceptedCallback){httpAcceptedCallback_ = httpAcceptedCallback;}QSharedPointer<QThreadPool> handleThreadPool() { return handleThreadPool_; }QSharedPointer<QThreadPool> serverThreadPool() { return serverThreadPool_; }virtual bool isRunning() = 0;protected Q_SLOTS:bool initialize();void deinitialize();protected:virtual bool onStart() = 0;virtual void onFinish() = 0;bool startServerThread();void stopHandleThread();void stopServerThread();void newSession(const QPointer<Session> &session);void handleAccepted(const QPointer<Session> &session);signals:void readyToClose();//void onRedReady(const QPointer<JQHttpServer::Session> &session);protected:QSharedPointer<QThreadPool> serverThreadPool_;QSharedPointer<QThreadPool> handleThreadPool_;QMutex mutex_;std::function<void(const QPointer<Session> &session,QObject *mainObj)> httpAcceptedCallback_;QSet<Session *> availableSessions_;QObject *m_mainObj;
};class TcpServerManage: public AbstractManage
{Q_OBJECTQ_DISABLE_COPY( TcpServerManage )public:TcpServerManage(const int &handleMaxThreadCount = 2);~TcpServerManage();bool listen( const QHostAddress &address, const quint16 &port );quint16 getListenPort() { return listenPort_; }private:bool isRunning();bool onStart();void onFinish();private:QPointer<QTcpServer> tcpServer_;QHostAddress listenAddress_ = QHostAddress::Any;quint16 listenPort_ = 0;
};#ifndef QT_NO_SSL
class SslServerHelper;class SslServerManage: public AbstractManage
{Q_OBJECTQ_DISABLE_COPY( SslServerManage )public:SslServerManage(const int &handleMaxThreadCount = 2);~SslServerManage();bool listen( const QHostAddress &                                   address,const quint16 &                                        port,const QString &                                        crtFilePath,const QString &                                        keyFilePath,const QList<QPair<QString, QSsl::EncodingFormat>> &caFileList = {},    // [ { filePath, format } ]const QSslSocket::PeerVerifyMode &                     peerVerifyMode = QSslSocket::VerifyNone );quint16 getListenPort() { return listenPort_; }private:bool isRunning();bool onStart();void onFinish();private:QPointer<SslServerHelper> tcpServer_;QHostAddress listenAddress_ = QHostAddress::Any;quint16      listenPort_    = 0;QSharedPointer<QSslConfiguration> sslConfiguration_;
};enum ServiceConfigEnum
{ServiceUnknownConfig,ServiceHttpListenPort,ServiceHttpsListenPort,ServiceProcessor, // QPointer<QObject> or QList<QPointer<QObject>>ServiceUuid,ServiceSslCrtFilePath,ServiceSslKeyFilePath,ServiceSslCAFilePath,ServiceSslPeerVerifyMode,
};class Service: public QObject
{Q_OBJECTQ_DISABLE_COPY( Service )private:enum ReceiveDataType{UnknownReceiveDataType,NoReceiveDataType,VariantListReceiveDataType,VariantMapReceiveDataType,ListVariantMapReceiveDataType,};struct ApiConfig{QPointer<QObject> process;QString             apiMethod;QString             apiName;QString             slotName;ReceiveDataType     receiveDataType = UnknownReceiveDataType;};class Recoder{public:Recoder( const QPointer<JQHttpServer::Session> &session );~Recoder();QPointer<JQHttpServer::Session> session_;QDateTime                         acceptedTime_;QString                           serviceUuid_;QString                           apiName;};protected:Service() = default;public:~Service() = default;static QSharedPointer<Service> createService( const QMap<ServiceConfigEnum, QVariant> &config );void registerProcessor( const QPointer<QObject> &processor );virtual QJsonDocument extractPostJsonData( const QPointer<JQHttpServer::Session> &session );static void reply(const QPointer<JQHttpServer::Session> &session,const QJsonObject &data,const bool &isSucceed = true,const QString &message = { },const int &httpStatusCode = 200 );static void reply(const QPointer<JQHttpServer::Session> &session,const bool &isSucceed = true,const QString &message = { },const int &httpStatusCode = 200 );virtual void httpGetPing( const QPointer<JQHttpServer::Session> &session );virtual void httpGetFaviconIco( const QPointer<JQHttpServer::Session> &session );virtual void httpOptions( const QPointer<JQHttpServer::Session> &session );protected:bool initialize( const QMap<ServiceConfigEnum, QVariant> &config );private:void onSessionAccepted( const QPointer<JQHttpServer::Session> &session );static QString snakeCaseToCamelCase(const QString &source, const bool &firstCharUpper = false);static QList<QVariantMap> variantListToListVariantMap(const QVariantList &source);private:QSharedPointer<JQHttpServer::TcpServerManage> httpServerManage_;QSharedPointer<JQHttpServer::SslServerManage> httpsServerManage_;QString                                     serviceUuid_;QMap<QString, QMap<QString, ApiConfig>> schedules_;    // apiMethod -> apiName -> APIQMap<QString, std::function<void( const QPointer<JQHttpServer::Session> &session )>> schedules2_; // apiPathPrefix -> callbackQPointer<QObject> certificateVerifier_;
};
#endif}#endif//JQLIBRARY_INCLUDE_JQHTTPSERVER_H_

1. Session 类

作用:处理单个 HTTP 请求/响应会话的全生命周期

核心功能

  • 请求解析
    存储 HTTP 请求的元数据(如 requestMethod_requestUrl_requestHeader_ 等),提供接口获取请求的:

    • 客户端 IP (requestSourceIp())

    • 请求方法(GET/POST等)

    • URL 路径和查询参数

    • 请求头和请求体内容

  • 响应生成
    提供多种响应方式:

    • 文本/JSON/二进制数据回复(replyText()/replyJsonObject()/replyBytes()

    • 文件/图片传输(replyFile()/replyImage()

    • 重定向(replyRedirects()

    • 支持设置 HTTP 状态码和自定义 Content-Type

  • 底层通信
    通过 QIODevice(如 QTcpSocket)与客户端进行数据交互,管理数据的异步写入(onBytesWritten() 处理写入进度)

  • 安全控制
    支持 SSL 证书验证(peerCertificate()),提供自动关闭连接的定时器(autoCloseTimer_

典型使用场景
当服务器接受一个新连接时,会创建一个 Session 对象,该对象解析客户端请求并调用相应的回复方法发送响应数据。


2. AbstractManage 类

作用:服务器管理的抽象基类,提供线程池和会话管理的基础设施

核心功能

  • 线程池管理
    维护两个线程池:

    • handleThreadPool_:处理业务逻辑(如调用用户设置的 httpAcceptedCallback_

    • serverThreadPool_:处理网络监听和连接接受(通过 startServerThread()

  • 会话生命周期管理
    跟踪所有活跃的 Session 对象(availableSessions_),提供统一的初始化/反初始化接口(initialize()/deinitialize()

  • 回调机制
    通过 setHttpAcceptedCallback() 允许用户注册自定义请求处理逻辑,当新会话建立时,触发 handleAccepted() 分发到线程池

  • 抽象接口
    定义纯虚函数 onStart() 和 onFinish(),要求子类实现具体的服务器启动/停止逻辑

设计目的
为不同类型的服务器(如 TCP、SSL、Local Socket)提供统一的管理框架,复用线程管理和会话跟踪逻辑。


3. TcpServerManage 类

作用:基于 TCP 协议的 HTTP 服务器具体实现

核心功能

  • TCP 服务器监听
    通过 listen() 方法在指定地址和端口启动 QTcpServer,等待客户端连接

  • 连接处理
    当新连接到达时,创建 Session 对象并调用 newSession(),将其加入管理队列

  • 继承实现
    实现父类 AbstractManage 的纯虚函数:

    • onStart():启动 TCP 服务器

    • onFinish():关闭服务器并清理资源

关键成员

  • QTcpServer* tcpServer_:底层 TCP 服务器实例

  • listenAddress_ 和 listenPort_:监听的地址和端口

使用场景
需快速搭建一个基于 TCP 的 HTTP 服务器时,直接实例化此类并调用 listen() 方法即可。


协作流程示例

  1. 启动服务器
    TcpServerManage 调用 listen() → 触发 onStart() 启动 QTcpServer

  2. 接受连接
    当客户端连接到达 → TcpServerManage 创建 Session 对象,并调用 AbstractManage::newSession()

  3. 处理请求
    AbstractManage 将新会话通过 httpAcceptedCallback_ 回调传递给用户代码,使用 handleThreadPool_ 异步处理

  4. 发送响应
    用户在回调中通过 Session::replyXXX() 方法生成响应数据 → 数据通过 QIODevice 异步发送给客户端

  5. 资源回收
    会话结束时,Session 的 autoCloseTimer_ 或写入完成信号触发资源释放,AbstractManage 维护的 availableSessions_ 自动清理失效会话。

http://www.dtcms.com/wzjs/42553.html

相关文章:

  • 第一次装wordpress整站优化多少钱
  • 做网站最适合用多大的图片前端性能优化
  • 做视频比较好的理财网站有哪些关键词推广怎么做
  • 网站页面热度产品推广计划方案模板
  • 如何为公司做网站电商关键词一般用哪些工具
  • _x wordpress搜索引擎优化行业
  • 网站做微信支付宝支付接口百度一下首页设为主页
  • 东营利津网站建设南宁最新消息今天
  • 青浦区网站建设公司2024年度关键词
  • 快速微信网站设计seo关键词怎么优化
  • 网站品牌形象设计怎么做微信营销软件群发
  • phpcms企业网站源码推广目标怎么写
  • 注册一个投资公司需要多少钱整站优化提升排名
  • 手机端网站开发语言网页制作成品模板网站
  • vr模式的网站建设公司b站视频未能成功转码
  • 免费做代理的项目郑州网站优化seo
  • 吉林省建筑市场监管公共服务平台石家庄seo全网营销
  • 怎么可以自己做网站被百度收到凤凰网全国疫情实时动态
  • 亚马逊网站开发者平台企业seo顾问服务阿亮
  • 手机版网站案例广州做网站的公司哪家好
  • 长沙企业网站开发微联讯点南昌企业网站建设
  • wordpress所见即所得编辑器佛山seo整站优化
  • bootstrap做购物网站广州百度seo优化排名
  • 做网站需要什么配置服务器成都百度推广联系方式
  • 网站建设与管理案例教程第三版答案网店营销策划方案ppt
  • 起诉网站服务平台搜索引擎优化培训班
  • 512m内存做网站免费发广告的网站大全
  • 比较好的做外贸网站河南自助建站seo公司
  • 做兽设的网站网站查询域名解析
  • 买网站需要多少钱网站排名点击工具