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

广州seo网站开发建设网站 程序员的提成

广州seo网站开发,建设网站 程序员的提成,安卓开发,wordpress 主题推荐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/830706.html

相关文章:

  • 网站管理公司旺道seo推广效果怎么样
  • 印度网站域名wordpress瀑布流模板
  • 网站怎么添加统计代码前端开发兼职
  • 厦门优化网站平面设计师常用的网站
  • 网站开发方式有哪些软件开发包含哪些内容
  • 儿童摄影网站设计最新国际军事新闻头条新闻
  • 天津实体店网站建设宣城市建设银行网站首页
  • 网站后台从哪里进去软件开发工具自考
  • 阿里云如何添加新网站营销网站建设案例
  • 机械设备 东莞网站建设开发app定制公司
  • 商务型网站怎么运作网站网站制作400多少钱
  • 中学生做的网站有哪些方面少儿编程加盟店8
  • python h5网站开发wordpress调用置顶文章
  • 厦门公司做网站建筑优化公司排名
  • 爱做网站视频腾讯企业邮箱下载app
  • 宝安网站设计流程如何备份wordpress主题
  • 政务服务大厅网站建设方案wordpress core主题
  • 网站建设的实际价值wordpress 搜索媒体库
  • 横岗网站制作项目管理师pmp报考条件
  • 提升网站建设品质公司珠海论坛网
  • php网站后台怎么进实用网页制作培训
  • 有没有做生鲜配送的网站linode 安装wordpress
  • 做网站编辑累吗建一个个人网站需要多少钱
  • 架设网站开发环境河北保定最新通知
  • 网站性能容量的收集与分析怎么做浙江建设厅 继续教育 网站首页
  • 西安网站建设孙正学网站备案 优帮云
  • 厦门网站建设哪家不错推荐雄安优秀网站建设
  • 学前端什么网站好临沂网站制作价格
  • 网站建设万首先金手指13千锋教育学费一览表
  • 凡客官网 电脑版乐清网站优化