当前位置:   article > 正文

QT 之 TCP 服务端 连接 多客户端 处理学习_qttcp多个客户端的建立和维护内容是什么

qttcp多个客户端的建立和维护内容是什么

    自学QT中, 在此记录一下TCP多链接的方法。

    跟着 “Qt Creator快速入门” 学了一段时间了,刚接触网络编程, 例子中仅仅简单的 用 客户端 连接了一下 服务端, 然后 服务端发送了一条信息就关闭了, 感觉太简单, 无法实际应用到项目中, 于是查找了下资料, 编写了一个多连接的 服务端, 监听本机第一个 ipv4的地址, 端口号固定为 9011,程序做的只是简单的 打印客户端的IP 及数据 , 在收到的数据前面添加几个字符 原路发送回去。客户端就不贴了, 比较简单, 测试可用使用sscom 最新版进行。代码-头文件如下:

  1. #ifndef SERVER_H
  2. #define SERVER_H
  3. #include <QDialog>
  4. #include <QList>
  5. class QTcpServer;
  6. class QTcpSocket;
  7. namespace Ui {
  8. class Server;
  9. }
  10. class Server : public QDialog
  11. {
  12. Q_OBJECT
  13. public:
  14. explicit Server(QWidget *parent = 0);
  15. ~Server();
  16. protected slots:
  17. void socketRead(void);
  18. private:
  19. Ui::Server *ui;
  20. QTcpServer *tcpServer;
  21. QList<QTcpSocket*> tcpSockets;
  22. private slots:
  23. void newConnect();
  24. void deleteSocket();
  25. };
  26. #endif // SERVER_H

代码-c++文件如下:

  1. #include "server.h"
  2. #include "ui_server.h"
  3. #include <QtNetwork>
  4. #include <QList>
  5. Server::Server(QWidget *parent) :
  6. QDialog(parent),
  7. ui(new Ui::Server)
  8. {
  9. ui->setupUi(this);
  10. QHostAddress addr; //IPv4地址(可能有多条)
  11. QHostInfo info = QHostInfo::fromName(QHostInfo::localHostName());
  12. qDebug()<<"IP Addr:"<< info.addresses();
  13. foreach(QHostAddress address, info.addresses())
  14. {
  15. if(address.protocol() == QAbstractSocket::IPv4Protocol)
  16. {
  17. addr = address; // qDebug() <<"IPv4 addr: "<< address.toString();
  18. ui->label->setText("Listen:" +address.toString() + ":9011");
  19. break;
  20. }
  21. }
  22. tcpServer = new QTcpServer(this); //QHostAddress("127.0.0.1")
  23. if (!tcpServer->listen(addr, 9011))
  24. {
  25. qDebug() << tcpServer->errorString();
  26. close();
  27. }
  28. connect(tcpServer, &QTcpServer::newConnection,
  29. this, &Server::newConnect);
  30. }
  31. Server::~Server()
  32. {
  33. delete ui;
  34. }
  35. void Server::newConnect()
  36. {
  37. // 获取已经建立的连接的套接字
  38. QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
  39. // 放入 QList
  40. tcpSockets.append(clientConnection);
  41. ui->textBrowser->append("NewClient:" + clientConnection->peerAddress().toString());
  42. // 数据就绪信号 到 自定义 读槽函数
  43. QObject::connect(clientConnection, &QTcpSocket::readyRead, this, &Server::socketRead);
  44. // 断开连接后 从QList中删除, 并删除套接字
  45. connect(clientConnection, &QTcpSocket::disconnected, this, &Server::deleteSocket);
  46. qDebug()<<"cli Num:"<<tcpSockets.size()<<endl;
  47. }
  48. void Server::deleteSocket(void)
  49. {
  50. int i = 0;
  51. foreach(QTcpSocket* soc, tcpSockets)
  52. {
  53. if(soc->state() == QTcpSocket::UnconnectedState)
  54. {
  55. qDebug()<<soc->peerAddress().toString()<<"closed"<<endl;
  56. soc->deleteLater();
  57. tcpSockets.removeAt(i); //tcpSockets.removeOne(soc);
  58. }
  59. i++;
  60. qDebug()<<"i:"<<i<<endl;
  61. }
  62. }
  63. void Server::socketRead(void)
  64. {
  65. QByteArray strs, block;
  66. foreach(QTcpSocket* soc, tcpSockets)
  67. {
  68. if(soc->bytesAvailable() > 0)
  69. {
  70. strs = soc->readAll();
  71. strs.insert(0, QString("S rec:"));
  72. soc->write(strs);
  73. }
  74. }
  75. ui->textBrowser->append("recNum:"+QString::number(strs.size()-6));
  76. ui->textBrowser->append(strs);
  77. }

server.ui 文件内容如下

  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <ui version="4.0">
  3. <class>Server</class>
  4. <widget class="QDialog" name="Server">
  5. <property name="geometry">
  6. <rect>
  7. <x>0</x>
  8. <y>0</y>
  9. <width>412</width>
  10. <height>433</height>
  11. </rect>
  12. </property>
  13. <property name="windowTitle">
  14. <string>Server</string>
  15. </property>
  16. <widget class="QLabel" name="label">
  17. <property name="geometry">
  18. <rect>
  19. <x>20</x>
  20. <y>30</y>
  21. <width>201</width>
  22. <height>31</height>
  23. </rect>
  24. </property>
  25. <property name="text">
  26. <string>等待连接!</string>
  27. </property>
  28. </widget>
  29. <widget class="QTextBrowser" name="textBrowser">
  30. <property name="geometry">
  31. <rect>
  32. <x>10</x>
  33. <y>80</y>
  34. <width>381</width>
  35. <height>331</height>
  36. </rect>
  37. </property>
  38. </widget>
  39. </widget>
  40. <layoutdefault spacing="6" margin="11"/>
  41. <resources/>
  42. <connections/>
  43. </ui>

截图:

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

闽ICP备14008679号