QHotkey
QlistWidget QTableWidget 窗口置顶 QCefView EXCEL Jieba分词 剪切板 Mysql QTableView QRegularExpression正则 JQHttpServer POST 匹配TDK unicode转中文 eventFilter dr_url与dr_member_url 缓存 URI地址 数据库操作 系统目录常量 模板标签 QSpinBox Quick QCompress压缩 QLibrary QMap QVariant QNetworkAccessManager Qchart QFile Qjson QJSEngine QFileDialog对话框 QSet QTimer时钟

首先:

#include "jqhttpserver.h"


然后将E:\CPP\lib\03JQHttpServer\library\JQLibrary\include 放到库目录


jqhttpserver.h  和 jqhttpserver.cpp 加入到项目中

JQHttpServer::TcpServerManage* tcpServerManage;//http服务
//服务器收到请求时执行
void jjsoft::onHttpAccepted(const QPointer< JQHttpServer::Session >& session)
{
 // 注1:因为一个session对应一个单一的HTTP请求,所以session只能reply一次
 // 注2:在reply后,session的生命周期不可控,所以reply后不要再调用session的接口了
 auto c = session->requestUrlQuery();//请求参数转qMap

 if (c["a"] == "web") //获取网站
 {
  QString k = c.value("k");
  QString ip = session->requestSourceIp();
  if (k.isEmpty())
  {
   log("请求关键为空");
   return;
  }
  lock.lockForRead();
  jj->s();
  QString jg;
  int iCount = 0;
  //for循环比iter 速度快1倍 
  for (int i = 0; i < txtSl.count(); i++)
  {
   if (txtSl.at(i).contains(k))
   {
    iCount++;
    jg.append(txtSl.at(i) + "\n");
   }
  }
  log(k + " 匹配:" + jj->i2s(iCount) + " 耗时:" + jj->e() + "ms IP:" + ip);
  lock.unlock();
  session->replyText(jg);
 }




 // 回调发生在专用的处理线程内,不是主线程,也不是socket的生存线程,请注意线程安全
 // 若阻塞了此回调,那么新的连接将被阻塞(默认情况下有2个线程可以阻塞2次,第3个连接将被阻塞)


 //   session->replyText(QString("url:%1\nbody:%2").arg(session->requestUrl(), QString(session->requestBody())));
 //    session->replyRedirects( QUrl( "http://www.baidu.com" ) );
 //    session->replyJsonObject( { { { "message", "ok" } } } );
 //    session->replyJsonArray( { "a", "b", "c" } );
 //    session->replyFile( "/Users/jason/Desktop/Test1.Test2" );
 //    session->replyImage( QImage( "/Users/jason/Desktop/Test.png" ) );
 //    session->replyBytes( QByteArray( 4,'\x24' ), "text" ); // $$$$


}



//按钮-开启服务
void jjsoft::btn_go() {

 if (ui.btn_go->text() == "开启服务")
 {

  QString txtStr = jj->readTxt("data.txt");
  txtSl = jj->split(txtStr);
  log("加载网站总数:" + jj->i2s(txtSl.count()));
  int port = ui.edt_port->text().toInt();
  //启动HTTP服务器
  tcpServerManage = new JQHttpServer::TcpServerManage(10);

  tcpServerManage->setHttpAcceptedCallback(std::bind(&jjsoft::onHttpAccepted, this, std::placeholders::_1));
  const auto listenSucceed = tcpServerManage->listen(QHostAddress::Any, port);

  if (listenSucceed)
  {
   log("HTTP服务器启动成功 端口:" + jj->i2s(port));
  }
  else {
   log("HTTP服务器启动失败");
  }
  ui.btn_go->setText("停止服务");
 }
 else {
  log("停止HTTP服务");
  tcpServerManage->deleteLater();
  ui.btn_go->setText("开启服务");
 }
}