• QT day5


    服务器

    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. //启动服务器按钮对应的槽函数
    16. void Widget::on_pushButton_clicked()
    17. {
    18. //获取ui界面上的端口号
    19. quint16 port = ui->lineEdit->text().toUInt();
    20. //将服务器设置成监听状态
    21. if(!server->listen(QHostAddress::Any, port))
    22. {
    23. QMessageBox::critical(this, "失败", "服务器启动失败");
    24. return;
    25. }
    26. else
    27. {
    28. QMessageBox::information(this, "成功", "服务器启动成功");
    29. }
    30. //此时表明服务器启动成功,并对客户端连接进行监听
    31. //如果有客户端向服务器发射连接请求,那么该服务器就会自动发射一个newConnection的信号
    32. connect(server, &QTcpServer::newConnection, this, &Widget::newConnection_slot);
    33. }
    34. //处理newConnection
    35. void Widget::newConnection_slot()
    36. {
    37. qDebug() << "有新的客户端发来连接请求了";
    38. //获取最新连接的客户端套接字
    39. QTcpSocket *s = server->nextPendingConnection();
    40. //将获取的套接字存放到客户端容器中
    41. clientlist.push_back(s);
    42. connect(s, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);
    43. }
    44. void Widget::readyRead_slot()
    45. {
    46. //删除客户端链表中无效的客户端套接字
    47. for(int i=0; icount(); i++)
    48. {
    49. //判断套接字的状态
    50. if(clientlist[i]->state() == 0) //SocketState state() const
    51. { //功能:返回客户端套接字的状态
    52. clientlist.removeAt(i);
    53. } //返回值:客户端的状态,如果结果为0,表示未连接
    54. }
    55. //遍历所有客户端,查看是哪个客户端发来数据
    56. for(int i=0; icount(); i++)
    57. {
    58. if(clientlist[i]->bytesAvailable() != 0)
    59. {
    60. //读取当前客户端的相关数据
    61. QByteArray msg = clientlist[i]->readAll();
    62. //将数据展示到ui界面上
    63. ui->listWidget->addItem(QString::fromLocal8Bit(msg));
    64. //将接受的信息,发送给所有客户端
    65. for(int j=0; jcount(); j++)
    66. {
    67. clientlist[j]->write(msg);
    68. }
    69. }
    70. }
    71. }

    客户端

    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. socket = new QTcpSocket(this);
    9. connect(socket, &QTcpSocket::connected, this, &Widget::connected_slot);
    10. //客户端与服务器连接成功后,服务器向客户端发来数据,那么客户端就会发射一个readyRead信号
    11. connect(socket, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);
    12. connect(socket, &QTcpSocket::disconnected, this, &Widget::disconnected_slot);
    13. }
    14. Widget::~Widget()
    15. {
    16. delete ui;
    17. }
    18. void Widget::on_connectBtn_clicked()
    19. {
    20. if(ui->connectBtn->text() == "连接服务器")
    21. {
    22. //获取ui界面信息
    23. Name = ui->userNameEdit->text();
    24. QString hostName = ui->ipEdit->text();
    25. quint16 port = ui->portEdit->text().toUInt();
    26. //连接到主机
    27. socket->connectToHost(hostName, port);
    28. //如果连接服务器成功,该客户端就会发射一个connected的信号
    29. ui->connectBtn->setText("断开服务器");
    30. }
    31. else if(ui->connectBtn->text() == "断开服务器")
    32. {
    33. QString msg = Name + ":拿手好戏后 离开聊天室";
    34. socket->write(msg.toLocal8Bit());
    35. //断开客户端与服务器的连接
    36. socket->disconnectFromHost();
    37. //当客户端与服务器断开,该客户端就会自动发送一个disconnected的信号
    38. ui->connectBtn->setText("连接服务器");
    39. }
    40. }
    41. //处理conneed信号的槽函数定义
    42. void Widget::connected_slot()
    43. {
    44. QMessageBox::information(this, "成功", "连接服务器成功");
    45. //顺便向服务器发送一条信息,说:***,进入聊天室
    46. QString msg = Name + ":带着power 进入聊天室";
    47. socket->write(msg.toLocal8Bit());
    48. }
    49. void Widget::readyRead_slot()
    50. {
    51. QByteArray msg = socket->readAll();
    52. ui->msgList->addItem(QString::fromLocal8Bit(msg));
    53. }
    54. void Widget::on_sendBtn_clicked()
    55. {
    56. //获取ui界面的编辑的文本
    57. QString m = ui->msgEdit->text();
    58. //整合要发送的信息
    59. QString msg = Name + ":" + m;
    60. //将信息发送给服务器
    61. socket->write(msg.toLocal8Bit());
    62. //发送后清空文本
    63. ui->msgEdit->clear();
    64. }
    65. void Widget::disconnected_slot()
    66. {
    67. QMessageBox::information(this, "退出", "断开服务器");
    68. }

    思维导图

  • 相关阅读:
    字符串漏洞注入深入学习
    华为OD机考:0023-磁盘容量排序
    Sentinel滑动时间窗口的原理及源码实现
    PowerConsume功耗计算器
    入门力扣自学笔记134 C++ (题目编号658)
    机器视觉之工业摄像机知识点(二)
    Flink -- window(窗口)
    TouchGFX之后端通信
    渗透测试——安全漏洞扫描工具APPScan的安装与基本使用步骤
    运放:运放输入电压
  • 原文地址:https://blog.csdn.net/zjt020305/article/details/132677409