当前位置:   article > 正文

Qt TCP/Ip 网络通信的两种用法-常规用法+多线程用法_qt 线程池tcpip

qt 线程池tcpip
  • 常规用法

  1. 创建服务器QTcpServer对象;
  2. 服务器对象开启监听QTcpServer::listen();
  3. QTcpServer::newconnection()信号关联到自定义槽函数;
  4. 槽函数中调用QTcpServer::nextpendingconnection()函数得到客户端连接的QTcpSocket对象;
  5. 使用QTcpSocket对象与客户端通信。
  • 多线程用法

基于多线程的用法有两种,第一种是子类化QThread,重写run函数,在run函数中用while或for语句实现多线程业务;第二种是使用事件循环实现多线程。本文介绍第二种使用方法。

  1. 自定义QObject子类Object处理服务端需要多线程完成的业务,比如网络数据的收发;
  2. 自定义QTcpServer子类TcpServer,子类中重写函数  incomingConnection(qintptr socketDescriptor);
  3. 创建服务器子类TcpServer对象;
  4. 服务器对象开启监听TcpServer::listen();
  5. TcpServer子类的incomingConnection(qintptr socketDescriptor)函数中处理接收到的网络连接信息socketDescriptor,将socketDescriptor参数传递给Object对象,并将QThread对象MoveToThread到Object对象中,到此可以放心的使用信号和槽实现多线程通信;
  6. 在Object类中使用socketDescriptor信息定义QTcpSocket套接字对象;
  7. 使用套接字对象在Object中与客户端通信。

   多线程用法关键代码:

  1. void TcpServer::incomingConnection(qintptr socketDescriptor)
  2. {//多线程网络连接,每个新的网络连接用一个新的线程管理
  3. QString slog = QString("TcpServer ThreadID::%1").arg(qint64(QThread::currentThreadId()));
  4. logInfo(slog);
  5. m_pThread = new QThread;
  6. m_pObject = new TcpServerObject();
  7. m_pObject->moveToThread(m_pThread);
  8. connect(this,SIGNAL(sigInitSocket(qint32)),m_pObject,SLOT(initSocket(qint32)));
  9. connect(m_pObject,SIGNAL(sigNewTime(QString)),this,SLOT(onNewTime(QString)));
  10. connect(this,SIGNAL(sigSendData()),m_pObject,SLOT(sendData()));
  11. m_pThread->start();
  12. emit sigInitSocket(socketDescriptor);
  13. }
  14. void TcpServerObject::initSocket(qint32 socketDescriptor)
  15. {
  16. m_pTcpSocket = new QTcpSocket;
  17. if(!m_pTcpSocket->setSocketDescriptor(socketDescriptor))
  18. {
  19. logError(m_pTcpSocket->errorString());
  20. return;
  21. }
  22. connect(m_pTcpSocket,SIGNAL(readyRead()),this,SLOT(recvData()));
  23. }

如下图所示,TcpServer 的ThreadID(即主线程ID:20748)与Object::recvData的 ThreadId、Object::sendData的 ThreadId (即次线程ID:21112)确实不同。因此可以将大量的耗时的业务放在Object类中实现。

注:在基于事件循环的多线程使用方法中,不要在Object的构造函数中作初始化,否则会告警:

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/盐析白兔/article/detail/305139
推荐阅读
相关标签
  

闽ICP备14008679号