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

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

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

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

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

重写incomingConnection()函数

首先在myserver.h里创建一个Myserver类继承QTcpServer,重写 incomingConnection();

并创建一个自定义信号。

  myserver.h

#ifndef MYSERVER_H
#define MYSERVER_H
#include<QTcpServer>

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<QThread>
#include<QTcpSocket>



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()<<"客服端来消息了";
}
void SocketThread::slot_disconnect()
{
    qDebug()<<"客户端已断开";
    isRun=false;
}
SocketThread::~SocketThread()
{
    qDebug()<<"子线程结束";
}

 主线程(重点)

在主线程里创建myserver类对象,监听客户端,等待客户端连接。当有客户端连接时,myserver类对象会发出自定义信号sig_sendsd(qintptr),通过connect()函数,执行槽函数slot_recv_sd()。在槽函数里创建子线程类对象,在子线程类对象里创建socket套接字(上图),跟客户端通信。

MainWindow::MainWindow(QWidget *parent) :
    QMainWindow(parent),
    ui(new Ui::MainWindow)
{
    ui->setupUi(this);
    initIp();
    server=new Myserver(this);
    server->listen(QHostAddress::Any,12345); //any所有地址  12345port
    //当有新的客户端连接,server对象会发出自定义信号
    connect(server,SIGNAL(sig_sendsd(qintptr)),this,SLOT(slot_recv_sd(qintptr)));
}
MainWindow::~MainWindow()
{
    delete ui;
}
void MainWindow::initIp()   //获取本地ip地址
{
    QString ip;
    QString hostName = QHostInfo::localHostName();
    QHostInfo info = QHostInfo::fromName(hostName);
    QList<QHostAddress> list=info.addresses();
    for(int i=0;i<list.size();i++)
    {
        //获取协议类型
        if(list[i].protocol()==QAbstractSocket::IPv4Protocol)
        {
            ip+="*";
            ip+=list[i].toString();
        }
    }
    ui->label_ip->setText(ip);
}
void MainWindow::slot_recv_sd(qintptr sd)
{
    //创建子线程
    st=new SocketThread(sd);
    st->start();
    
}

最后的最后,感谢大家的支持,请求各路英雄豪杰多多打赏,多多关注,多多点赞,我是只发布高质量文章的 better-code 。

  • 24
    点赞
  • 13
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
### 回答1: Qt是一个跨平台的C++应用程序开发框架,提供了丰富的功能和工具,用于快速开发高性能的应用程序。在Qt,有很多方式可以实现多线程并发服务器。 首先,Qt提供了QThread类,用于创建和管理线程。我们可以通过继承QThread类,并重写其run()函数,在该函数实现服务器逻辑。通过创建QThread对象,并调用start()函数,可以启动新的线程运行服务器。 另外,Qt还提供了QtConcurrent和QtConcurrent::run()函数,用于在新的线程执行函数。我们可以将服务器逻辑封装成一个函数,并使用QtConcurrent::run()函数在新的线程执行该函数。 除此之外,Qt还提供了信号与槽机制,用于线程之间的通信。我们可以将Qt的信号与槽机制用于多线程并发服务器,例如当有新的客户端连接时,服务器线程可以发送一个信号给主线程,主线程接收到信号后执行相应的槽函数,从而实现线程之间的通信和协调。 此外,为了实现高性能的多线程并发服务器,我们可以使用Qt的网络模块,例如QTcpServer和QTcpSocket类。QTcpServer类用于监听和处理客户端的连接请求,而QTcpSocket类用于实现服务器和客户端之间的通信。 总之,Qt提供了丰富的多线程并发服务器开发工具和组件,可以帮助我们快速构建高性能的服务器应用程序。无论是使用QThread类、QtConcurrent、信号与槽机制还是网络模块,都可以轻松实现一个可靠的多线程并发服务器。 ### 回答2: Qt是一个跨平台的C++应用程序框架,具有丰富的功能和强大的多线程支持。Qt库提供了一系列类和方法,可以轻松地实现并发服务器。 在Qt,可以使用QThread类来创建多线程,通过继承QThread类并重写run()函数来定义线程的执行逻辑。然后,可以实例化这个自定义的线程类,并调用start()函数来启动线程。 对于并发服务器,通常需要使用QTcpServer类来监听客户端连接,并使用QTcpSocket类与客户端通信。可以将QTcpServer的incomingConnection()函数重新实现,以便在有新客户端连接时创建一个新的QThread对象,并将QTcpSocket对象传递给这个线程对象。 在线程类的run()函数,可以使用QTcpSocket来接收和发送数据。可以使用QTcpSocket的readyRead信号来读取客户端发送的数据,并使用write()函数将服务器的响应发送回客户端。同时,QThread类也提供了信号和槽机制,可以方便地与其他线程进行通信。 在服务器的主线程,可以使用QThreadPool类来管理线程池,用于处理多个客户端的并发请求。可以调用setMaxThreadCount()函数来设置线程池的最大线程数,以控制并发连接的数量。 总结起来,Qt多线程并发服务器可以通过继承QThread类和使用QTcpServer和QTcpSocket类来实现。将每个客户端连接分配给一个独立的线程,并通过线程间的信号和槽来实现线程间的通信。使用QThreadPool来管理线程池,以控制并发连接的数量。这样可以有效地处理多个客户端的并发请求,并提供高性能的服务器应用程序。
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值