当前位置:   article > 正文

嵌入式:QT Day4

嵌入式:QT Day4

一、手动完成服务器的实现,并注释具体步骤

源码:

widget.h

  1. #ifndef WIDGET_H
  2. #define WIDGET_H
  3. #include <QWidget>
  4. #include <QTcpServer> //服务器类
  5. #include <QTcpSocket> //客户端类
  6. #include <QMessageBox> //对话框类
  7. #include <QList> //链表容器
  8. #include <QDebug> //信息调试类
  9. QT_BEGIN_NAMESPACE
  10. namespace Ui { class Widget; }
  11. QT_END_NAMESPACE
  12. class Widget : public QWidget
  13. {
  14. Q_OBJECT
  15. public:
  16. Widget(QWidget *parent = nullptr);
  17. ~Widget();
  18. void newConnnecttion_slot(); //自定义槽函数,用来处理有客户端发送连接请求后,服务器自动发送的newConnecttion信号
  19. void readyRead_slot(); //自定义槽函数,用来处理客户端要向客户端发送信息时,客户端自动发送的readyRead信号
  20. private slots:
  21. void on_pushButton_clicked();
  22. private:
  23. Ui::Widget *ui;
  24. //定义服务器指针
  25. QTcpServer *server;
  26. //定义存储客户端套接字容器
  27. QList<QTcpSocket*> sockList;
  28. };
  29. #endif // WIDGET_H

widget.cpp

  1. #include "widget.h"
  2. #include "ui_widget.h"
  3. Widget::Widget(QWidget *parent)
  4. : QWidget(parent)
  5. , ui(new Ui::Widget)
  6. {
  7. ui->setupUi(this);
  8. //实例化一个服务器对象
  9. server = new QTcpServer(this);
  10. }
  11. Widget::~Widget()
  12. {
  13. delete ui;
  14. }
  15. void Widget::on_pushButton_clicked()
  16. {
  17. //将行编辑器的内容赋值到port中
  18. quint16 port = ui->lineEdit->text().toUInt();
  19. //监听
  20. if(server->listen(QHostAddress::Any, port)){
  21. QMessageBox::information(this, "连接提示", "客户端连接成功!");
  22. }else{
  23. QMessageBox::information(this, "连接提示", "客户端连接失败!");
  24. }
  25. //此时服务器已经处于监听状态,如果有客户端发送连接请求,那么该服务器会自动发送newConnnecttion信号
  26. //我们可以将该信号连接到自定义的槽函数中,处理新套接字
  27. connect(server, &QTcpServer::newConnection, this, &Widget::newConnnecttion_slot);
  28. }
  29. void Widget::newConnnecttion_slot()
  30. {
  31. //保存服务器接收到的客户端套接字指针
  32. QTcpSocket *s = server->nextPendingConnection();
  33. //将该套接字指针放到容器中
  34. sockList.push_back(s);
  35. //此时服务器与客户端已建立连接
  36. //如果客户端要向服务器发送信息,那么会发送一个readyRead信号
  37. //此时需要将该信号与自定义槽函数连接,读取客户端数据
  38. connect(s, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);
  39. }
  40. void Widget::readyRead_slot(){
  41. //移除无效客户端
  42. for(int i = 0; i < sockList.count(); i++){ //sockList.count() 表示存储客户端套接字的容器内元素个数
  43. if(sockList.at(i)->state() == 0){ //state表示客户端的状态,是一个枚举值,=0表示该客户端已断开连接
  44. sockList.removeAt(i); //移除该客户端
  45. }
  46. }
  47. //遍历客户端容器,判断是哪个客户端有数据要读
  48. for(int i = 0; i < sockList.count(); i++){
  49. if(sockList.at(i)->bytesAvailable() != 0){ //表示该客户端有数据要读
  50. //读取该客户端发送的全部信息
  51. QByteArray msg = sockList.at(i)->readAll();
  52. //将数据展示到ui界面
  53. ui->listWidget->addItem(QString::fromLocal8Bit(msg));
  54. //将该消息发送给所有客户端
  55. for(int i = 0; i < sockList.count(); i++){
  56. sockList.at(i)->write(msg);
  57. }
  58. }
  59. }
  60. }

main.cpp

  1. #include "widget.h"
  2. #include <QApplication>
  3. int main(int argc, char *argv[])
  4. {
  5. QApplication a(argc, argv);
  6. Widget w;
  7. w.show();
  8. return a.exec();
  9. }

二、思维导图

本文内容由网友自发贡献,转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/137410?site
推荐阅读
相关标签
  

闽ICP备14008679号