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

打印 上一主题 下一主题

主题 532|帖子 532|积分 1611

什么是多线程并发服务器?在QT里怎样利用多线程并发服务器呢?
多线程并发服务器是一种网络服务器计划,它可以大概同时处置惩罚多个客户端的哀求。在多线程服务器中,主线程负责监听和接受来自客户端的毗连哀求,每当有一个新的毗连哀求到来时,服务器就会创建一个新的线程来处置惩罚该毗连。这样,每个客户端都有一个专门的线程来为之服务,从而实现并发处置惩罚多个客户端哀求的目的。
下面是怎样在QT里利用多线程并发服务器的流程。
可以先看这个图理解一下。


重写incomingConnection()函数

起首在myserver.h里创建一个Myserver类继承QTcpServer,重写 incomingConnection();
并创建一个自定义信号。
  myserver.h
  1. #ifndef MYSERVER_H
  2. #define MYSERVER_H
  3. #include<QTcpServer>
  4. class Myserver:public QTcpServer
  5. {
  6.     Q_OBJECT
  7. public:
  8.     Myserver(QObject *parent = 0);
  9.     //重写,传递套接字描述(sd标志)
  10.     void incomingConnection(qintptr socketDescriptor);
  11.     ~Myserver();
  12. signals:   //信号函数不需要实现
  13.     void sig_sendsd(qintptr sd);
  14. };
  15. #endif // MYSERVER_H
复制代码

 在myserver.c里实现重写的incomingConnection()函数,当有客户端毗连的时,会发送包含socket套接字描述符的信号sig_sendsd(socketDescriptor)(上面创建的信号)到主线程。(套接字描述符socketDescriptor很告急,在子线程里用来创建socket对象跟客户端进行通信)。
  1. #include "myserver.h"
  2. Myserver::Myserver(QObject *parent):QTcpServer(parent)
  3. {
  4. }
  5. void Myserver::incomingConnection(qintptr socketDescriptor)
  6. {
  7.     //发送自定义信号给主线程(sd标志)
  8.     emit sig_sendsd(socketDescriptor);
  9. }
  10. Myserver::~Myserver()
  11. {
  12. }
复制代码
创建子线程类

在socketthread.h里创建一个叫socketthread的子线程类用于处置惩罚每个客户端发来的信息。
  1. #ifndef SOCKETTHREAD_H
  2. #define SOCKETTHREAD_H
  3. #include<QThread>
  4. #include<QTcpSocket>
  5. class SocketThread:public QThread
  6. {
  7.     Q_OBJECT
  8. public:
  9.     SocketThread(qintptr sd);
  10.     void run();  //重写run函数,执行线程
  11.    
  12.     ~SocketThread();
  13. private slots:
  14.     void slot_read();
  15.     void slot_disconnect();
  16. private:
  17.     qintptr sd;
  18.     QTcpSocket *socket;
  19.    
  20. };
  21. #endif // SOCKETTHREAD_H
复制代码
 在socketthread.c中run()函数中处置惩罚客户端发来的信息,以及发送信息到客户端。
  1. #include "socketthread.h"
  2. SocketThread::SocketThread(qintptr sd):sd(sd)
  3. {
  4.    
  5. }
  6. void SocketThread::run()
  7. {
  8.     socket=new QTcpSocket;
  9.     socket->setSocketDescriptor(sd);
  10.     connect(socket,SIGNAL(readyRead()),this,SLOT(slot_read()));
  11.     connect(socket,SIGNAL(disconnected()),this,SLOT(slot_disconnect()));  
  12. }
  13. void SocketThread::slot_read()
  14. {
  15.     isRead=true;
  16.     qDebug()<<"客服端来消息了";
  17. }
  18. void SocketThread::slot_disconnect()
  19. {
  20.     qDebug()<<"客户端已断开";
  21.     isRun=false;
  22. }
  23. SocketThread::~SocketThread()
  24. {
  25.     qDebug()<<"子线程结束";
  26. }
复制代码
 主线程(重点)

在主线程里创建myserver类对象,监听客户端,等待客户端毗连。当有客户端毗连时,myserver类对象会发出自定义信号sig_sendsd(qintptr),通过connect()函数,执行槽函数slot_recv_sd()。在槽函数里创建子线程类对象,在子线程类对象里创建socket套接字(上图),跟客户端通信。
  1. MainWindow::MainWindow(QWidget *parent) :
  2.     QMainWindow(parent),
  3.     ui(new Ui::MainWindow)
  4. {
  5.     ui->setupUi(this);
  6.     initIp();
  7.     server=new Myserver(this);
  8.     server->listen(QHostAddress::Any,12345); //any所有地址  12345port
  9.     //当有新的客户端连接,server对象会发出自定义信号
  10.     connect(server,SIGNAL(sig_sendsd(qintptr)),this,SLOT(slot_recv_sd(qintptr)));
  11. }
  12. MainWindow::~MainWindow()
  13. {
  14.     delete ui;
  15. }
  16. void MainWindow::initIp()   //获取本地ip地址
  17. {
  18.     QString ip;
  19.     QString hostName = QHostInfo::localHostName();
  20.     QHostInfo info = QHostInfo::fromName(hostName);
  21.     QList<QHostAddress> list=info.addresses();
  22.     for(int i=0;i<list.size();i++)
  23.     {
  24.         //获取协议类型
  25.         if(list[i].protocol()==QAbstractSocket::IPv4Protocol)
  26.         {
  27.             ip+="*";
  28.             ip+=list[i].toString();
  29.         }
  30.     }
  31.     ui->label_ip->setText(ip);
  32. }
  33. void MainWindow::slot_recv_sd(qintptr sd)
  34. {
  35.     //创建子线程
  36.     st=new SocketThread(sd);
  37.     st->start();
  38.    
  39. }
复制代码

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

免责声明:如果侵犯了您的权益,请联系站长,我们会及时删除侵权内容,谢谢合作!更多信息从访问主页:qidao123.com:ToB企服之家,中国第一个企服评测及商务社交产业平台。
回复

使用道具 举报

0 个回复

倒序浏览

快速回复

您需要登录后才可以回帖 登录 or 立即注册

本版积分规则

大连全瓷种植牙齿制作中心

金牌会员
这个人很懒什么都没写!

标签云

快速回复 返回顶部 返回列表