在QT中使用多线程并发服务器(C++)
什么是多线程并发服务器?在QT里如何使用多线程并发服务器呢?
多线程并发服务器是一种网络服务器设计,它能够同时处理多个客户端的请求。在多线程服务器中,主线程负责监听和接受来自客户端的连接请求,每当有一个新的连接请求到来时,服务器就会创建一个新的线程来处理该连接。这样,每个客户端都有一个专门的线程来为之服务,从而实现并发处理多个客户端请求的目的。
下面是如何在QT里使用多线程并发服务器的流程。
可以先看这个图理解一下。
重写incomingConnection()函数
首先在myserver.h里创建一个Myserver类继承QTcpServer,重写 incomingConnection();
并创建一个自定义信号。
myserver.h
#ifndef MYSERVER_H
#define MYSERVER_H
#include
class Myserver:public QTcpServer
{
Q_OBJECT
public:
Myserver(QObject *parent = 0);
//重写,传递套接字描述(sd标志)
void incomingConnection(qintptr socketDescriptor);
~Myserver();
signals: //信号函数不需要实现
void sig_sendsd(qintptr sd);
};
#endif // MYSERVER_H
在myserver.c里实现重写的incomingConnection()函数,当有客户端连接的时,会发送包含socket套接字描述符的信号sig_sendsd(socketDescriptor)(上面创建的信号)到主线程。(套接字描述符socketDescriptor很重要,在子线程里用来创建socket对象跟客户端进行通信)。
#include "myserver.h"
Myserver::Myserver(QObject *parent):QTcpServer(parent)
{
}
void Myserver::incomingConnection(qintptr socketDescriptor)
{
//发送自定义信号给主线程(sd标志)
emit sig_sendsd(socketDescriptor);
}
Myserver::~Myserver()
{
}
创建子线程类
在socketthread.h里创建一个叫socketthread的子线程类用于处理每个客户端发来的信息。
#ifndef SOCKETTHREAD_H
#define SOCKETTHREAD_H
#include
#include
class SocketThread:public QThread
{
Q_OBJECT
public:
SocketThread(qintptr sd);
void run(); //重写run函数,执行线程
~SocketThread();
private slots:
void slot_read();
void slot_disconnect();
private:
qintptr sd;
QTcpSocket *socket;
};
#endif // SOCKETTHREAD_H
在socketthread.c中run()函数中处理客户端发来的信息,以及发送信息到客户端。
#include "socketthread.h"
SocketThread::SocketThread(qintptr sd):sd(sd)
{
}
void SocketThread::run()
{
socket=new QTcpSocket;
socket->setSocketDescriptor(sd);
connect(socket,SIGNAL(readyRead()),this,SLOT(slot_read()));
connect(socket,SIGNAL(disconnected()),this,SLOT(slot_disconnect()));
}
void SocketThread::slot_read()
{
isRead=true;
qDebug()
免责声明:我们致力于保护作者版权,注重分享,被刊用文章因无法核实真实出处,未能及时与作者取得联系,或有版权异议的,请联系管理员,我们会立即处理! 部分文章是来自自研大数据AI进行生成,内容摘自(百度百科,百度知道,头条百科,中国民法典,刑法,牛津词典,新华词典,汉语词典,国家院校,科普平台)等数据,内容仅供学习参考,不准确地方联系删除处理! 图片声明:本站部分配图来自人工智能系统AI生成,觅知网授权图片,PxHere摄影无版权图库和百度,360,搜狗等多加搜索引擎自动关键词搜索配图,如有侵权的图片,请第一时间联系我们,邮箱:ciyunidc@ciyunshuju.com。本站只作为美观性配图使用,无任何非法侵犯第三方意图,一切解释权归图片著作权方,本站不承担任何责任。如有恶意碰瓷者,必当奉陪到底严惩不贷!

