• QT建立TCP服务器


    1. QT += core gui network
    2. ***************************************************
    3. #ifndef WIDGET_H
    4. #define WIDGET_H
    5. #include <QWidget>
    6. #include <QTcpServer> //服务器头文件
    7. #include <QTcpSocket>//客户端头文件
    8. #include <QList>//存放客户端容器
    9. #include <QDebug>
    10. #include <QMessageBox>
    11. QT_BEGIN_NAMESPACE
    12. namespace Ui { class Widget; }
    13. QT_END_NAMESPACE
    14. class Widget : public QWidget
    15. {
    16. Q_OBJECT
    17. public:
    18. Widget(QWidget *parent = nullptr);
    19. ~Widget();
    20. private slots:
    21. void on_btn1_clicked();//启动按钮槽函数
    22. void newConnection_slot();//自定义处理连接信号的槽函数]
    23. void readyRead_slot();//自定义处理发送数据处理信号槽函数
    24. private:
    25. Ui::Widget *ui;
    26. //定义服务器指针
    27. QTcpServer *server;
    28. //定义客户端链表容器
    29. QList<QTcpSocket *> clientList;
    30. };
    31. #endif // WIDGET_H
    32. ************************************************************
    33. #include "widget.h"
    34. #include "ui_widget.h"
    35. Widget::Widget(QWidget *parent)
    36. : QWidget(parent)
    37. , ui(new Ui::Widget)
    38. {
    39. ui->setupUi(this);
    40. server = new QTcpServer(this);//实例化对象,创建了一个服务器
    41. }
    42. Widget::~Widget()
    43. {
    44. delete ui;
    45. }
    46. //启动服务器
    47. void Widget::on_btn1_clicked()
    48. {
    49. //获取端口号
    50. quint16 port = ui->port->text().toUInt();
    51. //服务器设置成监听状态
    52. if(!server->listen(QHostAddress::Any,port))
    53. {
    54. QMessageBox::critical(this,"失败","服务器启动失败");
    55. return;
    56. }
    57. else
    58. {
    59. QMessageBox::information(this,"成功","服务器启动成功");
    60. }
    61. //如果客户端向服务器发来连接请求,服务器自动发送一个newConnection信号
    62. connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot);
    63. }
    64. //
    65. void Widget::newConnection_slot()
    66. {
    67. //获取客服端套接字
    68. QTcpSocket *p=server->nextPendingConnection();
    69. //将获取的套接字放在客户端容器中
    70. clientList.push_back(p);
    71. //如果客户端向服务器发送数据,客户端会发射一个readyRead信号
    72. connect(p,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
    73. }
    74. //
    75. void Widget::readyRead_slot()
    76. {
    77. //删除客户端链表中未连接的客户端套接字
    78. for(int i=0;i<clientList.count();i++)
    79. {
    80. if(clientList[i]->state()==0)
    81. {
    82. clientList.removeAt(i);
    83. }
    84. }
    85. //遍历所有客户端,查看客户端发送的数据
    86. for(int i=0;i<clientList.count();i++)
    87. {
    88. if(clientList[i]->bytesAvailable()!=0)
    89. {
    90. //字符数组存读取的内容
    91. QByteArray msg = clientList[i]->readAll();
    92. //将数据展示到ui上
    93. ui->msglist->addItem(QString::fromLocal8Bit(msg));
    94. //将接受的内容发送给所有的客户端
    95. for(int j=0;j<clientList.count();j++)
    96. {
    97. clientList[j]->write(msg);
    98. }
    99. }
    100. }
    101. }

  • 相关阅读:
    关于java String类(源码等)分析
    谷歌浏览器Chrome 100即将发布,但可能无法正常使用?
    Redis设计与实现(六)| 集群(分片)
    环境主题静态HTML网页作业作品 大学生环保网页设计制作成品 简单DIV CSS布局网站
    Nginx proxy_set_header参数设置
    大数据必学Java基础(九十三):JDBC完成CURD
    C++面试八股文:std::string是如何实现的?
    Springboot整合RocketMQ之生产者
    Java并发工具类:Semaphore
    STM32 | GPIO口的普通与复用如何配置与用法,本文降从最底层教你如何查看手册运用寄存器来实现GPIO口的配置
  • 原文地址:https://blog.csdn.net/qq_61395411/article/details/132677738