httpserver.h

#ifndef HTTPSERVER_H
#define HTTPSERVER_H #include <QObject>
#include <QtCore>
#include <QtNetwork>
class HttpServer : public QObject
{
Q_OBJECT
public:
static HttpServer &instance();
void run(const QHostAddress &address = QHostAddress::Any,const quint16 &port = 80);
signals: public slots:
private slots:
void newConnection();
void readyRead();
private:
explicit HttpServer(QObject *parent = nullptr);
~HttpServer();
Q_DISABLE_COPY(HttpServer)
private:
QTcpServer *m_httpServer;
}; #endif // HTTPSERVER_H

httpserver.cpp

#include "httpserver.h"

HttpServer &HttpServer::instance()
{
static HttpServer obj;
return obj;
} void HttpServer::run(const QHostAddress &address, const quint16 &port)
{
m_httpServer->listen(address,port);
} void HttpServer::newConnection()
{
qDebug() << "newConnection";
QTcpSocket *m_socket = m_httpServer->nextPendingConnection();
QObject::connect(m_socket,&QTcpSocket::readyRead,this,&HttpServer::readyRead);
} void HttpServer::readyRead()
{
QTcpSocket *socket = qobject_cast<QTcpSocket*>(sender());
if(socket){
QByteArray request = socket->readAll(); qDebug() << "Request Data:" << request; static int count = 0;
count++;
QByteArray response = QString("<h1><center>Hello World %1</center></h1>\r\n").arg(count).toUtf8(); QString http = "HTTP/1.1 200 OK\r\n";
http += "Server: nginx\r\n";
http += "Content-Type: text/html;charset=utf-8\r\n";
http += "Connection: keep-alive\r\n";
http += QString("Content-Length: %1\r\n\r\n").arg(QString::number(response.size())); socket->write(http.toUtf8());
socket->write(response);
socket->flush();
socket->waitForBytesWritten(http.size() + response.size());
socket->close();
}
} HttpServer::HttpServer(QObject *parent) : QObject(parent)
{
m_httpServer = new QTcpServer(this);
m_httpServer->setMaxPendingConnections(1024);//设置最大允许连接数
QObject::connect(m_httpServer,&QTcpServer::newConnection,this,&HttpServer::newConnection);
} HttpServer::~HttpServer()
{ }

运行

HttpServer::instance().run();

访问 127.0.0.1 即可

如何写一个简单的基于 Qt 框架的 HttpServer ?的更多相关文章

  1. [Vue]写一个简单的文件上传控件

    ​这篇将介绍如何写一个简单的基于Vue+Element的文件上传控件. 控件将具有 1. 上传队列的列表,显示文件名称,大小等信息,可以显示上传进度实时刷新 2. 取消上传 ​ 使用Element的u ...

  2. 用Python写一个简单的Web框架

    一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...

  3. 通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解

    首先感谢张队@geffzhang公众号转发了上一篇文章,希望广大.neter多多推广dapr,让云原生更快更好的在.net这片土地上落地生根. 目录:一.通过Dapr实现一个简单的基于.net的微服务 ...

  4. 动手写一个简单的Web框架(模板渲染)

    动手写一个简单的Web框架(模板渲染) 在百度上搜索jinja2,显示的大部分内容都是jinja2的渲染语法,这个不是Web框架需要做的事,最终,居然在Werkzeug的官方文档里找到模板渲染的代码. ...

  5. 动手写一个简单的Web框架(Werkzeug路由问题)

    动手写一个简单的Web框架(Werkzeug路由问题) 继承上一篇博客,实现了HelloWorld,但是这并不是一个Web框架,只是自己手写的一个程序,别人是无法通过自己定义路由和返回文本,来使用的, ...

  6. 动手写一个简单的Web框架(HelloWorld的实现)

    动手写一个简单的Web框架(HelloWorld的实现) 关于python的wsgi问题可以看这篇博客 我就不具体阐述了,简单来说,wsgi标准需要我们提供一个可以被调用的python程序,可以实函数 ...

  7. 通过Dapr实现一个简单的基于.net的微服务电商系统(二十)——Saga框架实现思路分享

    今天这篇博文的主要目的是分享一下我设计Saga的实现思路来抛砖引玉,其实Saga本身非常的类似于一个简单的工作流体系,相比工作流不一样的部分在于它没有工作流的复杂逻辑处理机制(比如会签),没有条件分支 ...

  8. struts1:(Struts重构)构建一个简单的基于MVC模式的JavaWeb

    在构建一个简单的基于MVC模式的JavaWeb 中,我们使用了JSP+Servlet+JavaBean构建了一个基于MVC模式的简单登录系统,但在其小结中已经指出,这种模式下的Controller 和 ...

  9. 构建一个简单的基于MVC模式的JavaWeb

    零晨三点半了,刚刚几个兄弟一起出去吼歌,才回来,这应该是我大学第二次去K歌,第一次是大一吧,之后每次兄弟喊我,我都不想去,因为我还是很害怕去KTV,或许是因为那里是我伤心的地方,也或许是因为我在那里失 ...

随机推荐

  1. 01scikit-learn数据集下载

    In [2]: from sklearn.datasets import load_iris iris = load_iris() iris.keys() Out[2]: dict_keys(['da ...

  2. POJ 2960 S-Nim (sg函数)

    题目链接:http://poj.org/problem?id=2960 题目大意:给定数组S,接下来给出m个游戏局面.游戏局面是一些beads堆,先给出堆数,然后是每一堆中beads的数目.游戏规则是 ...

  3. Rabbit MQ项目例子

    地址链接: https://blog.csdn.net/cartoonmiao/article/details/51920766

  4. How to permanently set $PATH on Linux/Unix?

    You need to add it to your ~/.profile or ~/.bashrc file. export PATH=$PATH:/path/to/dir Depending on ...

  5. APP稳定性测试-monkey执行

    Monkey命令行可用的全部选项 *示例 : adb shell monkey -p cn.lejiayuan.alpha --pct-touch 30 --pct-motion 15 --pct-t ...

  6. 对webpack的初步研究7

    Configuration 您可能已经注意到很少有webpack配置看起来完全相同.这是因为webpack的配置文件是导出对象的JavaScript文件.然后,webpack根据其定义的属性处理此对象 ...

  7. [LeetCode] 238. 除自身以外数组的乘积 ☆☆☆(左积*右积)

    描述 给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积. 示例: 输入: ...

  8. SystemUI分析

    SystemUI是安卓的一个系统APP,负责的内容有系统通知栏,状态栏,最近应用程序,锁屏,壁纸,屏保,系统对话框,截屏,录屏等功能. Apk的路径位于/system/priv-app,源码code位 ...

  9. jsp文件断点上传

    之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...

  10. [Ynoi2012]D1T3

    https://www.luogu.org/problemnew/show/P5311 题解 先把点分树建出来. 对于吗,每一个询问\((l,r,x)\),我们对于x要找到它在点分树上最靠上的父亲节点 ...