如何写一个简单的基于 Qt 框架的 HttpServer ?
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 ?的更多相关文章
- [Vue]写一个简单的文件上传控件
这篇将介绍如何写一个简单的基于Vue+Element的文件上传控件. 控件将具有 1. 上传队列的列表,显示文件名称,大小等信息,可以显示上传进度实时刷新 2. 取消上传 使用Element的u ...
- 用Python写一个简单的Web框架
一.概述 二.从demo_app开始 三.WSGI中的application 四.区分URL 五.重构 1.正则匹配URL 2.DRY 3.抽象出框架 六.参考 一.概述 在Python中,WSGI( ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(二)——通讯框架讲解
首先感谢张队@geffzhang公众号转发了上一篇文章,希望广大.neter多多推广dapr,让云原生更快更好的在.net这片土地上落地生根. 目录:一.通过Dapr实现一个简单的基于.net的微服务 ...
- 动手写一个简单的Web框架(模板渲染)
动手写一个简单的Web框架(模板渲染) 在百度上搜索jinja2,显示的大部分内容都是jinja2的渲染语法,这个不是Web框架需要做的事,最终,居然在Werkzeug的官方文档里找到模板渲染的代码. ...
- 动手写一个简单的Web框架(Werkzeug路由问题)
动手写一个简单的Web框架(Werkzeug路由问题) 继承上一篇博客,实现了HelloWorld,但是这并不是一个Web框架,只是自己手写的一个程序,别人是无法通过自己定义路由和返回文本,来使用的, ...
- 动手写一个简单的Web框架(HelloWorld的实现)
动手写一个简单的Web框架(HelloWorld的实现) 关于python的wsgi问题可以看这篇博客 我就不具体阐述了,简单来说,wsgi标准需要我们提供一个可以被调用的python程序,可以实函数 ...
- 通过Dapr实现一个简单的基于.net的微服务电商系统(二十)——Saga框架实现思路分享
今天这篇博文的主要目的是分享一下我设计Saga的实现思路来抛砖引玉,其实Saga本身非常的类似于一个简单的工作流体系,相比工作流不一样的部分在于它没有工作流的复杂逻辑处理机制(比如会签),没有条件分支 ...
- struts1:(Struts重构)构建一个简单的基于MVC模式的JavaWeb
在构建一个简单的基于MVC模式的JavaWeb 中,我们使用了JSP+Servlet+JavaBean构建了一个基于MVC模式的简单登录系统,但在其小结中已经指出,这种模式下的Controller 和 ...
- 构建一个简单的基于MVC模式的JavaWeb
零晨三点半了,刚刚几个兄弟一起出去吼歌,才回来,这应该是我大学第二次去K歌,第一次是大一吧,之后每次兄弟喊我,我都不想去,因为我还是很害怕去KTV,或许是因为那里是我伤心的地方,也或许是因为我在那里失 ...
随机推荐
- 01scikit-learn数据集下载
In [2]: from sklearn.datasets import load_iris iris = load_iris() iris.keys() Out[2]: dict_keys(['da ...
- POJ 2960 S-Nim (sg函数)
题目链接:http://poj.org/problem?id=2960 题目大意:给定数组S,接下来给出m个游戏局面.游戏局面是一些beads堆,先给出堆数,然后是每一堆中beads的数目.游戏规则是 ...
- Rabbit MQ项目例子
地址链接: https://blog.csdn.net/cartoonmiao/article/details/51920766
- 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 ...
- APP稳定性测试-monkey执行
Monkey命令行可用的全部选项 *示例 : adb shell monkey -p cn.lejiayuan.alpha --pct-touch 30 --pct-motion 15 --pct-t ...
- 对webpack的初步研究7
Configuration 您可能已经注意到很少有webpack配置看起来完全相同.这是因为webpack的配置文件是导出对象的JavaScript文件.然后,webpack根据其定义的属性处理此对象 ...
- [LeetCode] 238. 除自身以外数组的乘积 ☆☆☆(左积*右积)
描述 给定长度为 n 的整数数组 nums,其中 n > 1,返回输出数组 output ,其中 output[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积. 示例: 输入: ...
- SystemUI分析
SystemUI是安卓的一个系统APP,负责的内容有系统通知栏,状态栏,最近应用程序,锁屏,壁纸,屏保,系统对话框,截屏,录屏等功能. Apk的路径位于/system/priv-app,源码code位 ...
- jsp文件断点上传
之前仿造uploadify写了一个HTML5版的文件上传插件,没看过的朋友可以点此先看一下~得到了不少朋友的好评,我自己也用在了项目中,不论是用户头像上传,还是各种媒体文件的上传,以及各种个性的业务需 ...
- [Ynoi2012]D1T3
https://www.luogu.org/problemnew/show/P5311 题解 先把点分树建出来. 对于吗,每一个询问\((l,r,x)\),我们对于x要找到它在点分树上最靠上的父亲节点 ...