在QT中使用多线程并发服务器(C++)

07-13 1923阅读

什么是多线程并发服务器?在QT里如何使用多线程并发服务器呢?

多线程并发服务器是一种网络服务器设计,它能够同时处理多个客户端的请求。在多线程服务器中,主线程负责监听和接受来自客户端的连接请求,每当有一个新的连接请求到来时,服务器就会创建一个新的线程来处理该连接。这样,每个客户端都有一个专门的线程来为之服务,从而实现并发处理多个客户端请求的目的。

下面是如何在QT里使用多线程并发服务器的流程。

可以先看这个图理解一下。

在QT中使用多线程并发服务器(C++)

重写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()
VPS购买请点击我

文章版权声明:除非注明,否则均为主机测评原创文章,转载或复制请以超链接形式并注明出处。

目录[+]