• 十月四日作业


    1、服务器

    头文件:

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. #include //服务器头文件
    5. #include //客户端头文件
    6. #include //链表容器
    7. #include //消息对话框
    8. #include
    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. private slots:
    19. void on_switchBtn_clicked();
    20. void newConnection_slot(); //自定义处理newConnection信号的槽函数的声明
    21. void readyRead_slot(); //自定义处理readyRead信号的槽函数的声明
    22. private:
    23. Ui::Widget *ui;
    24. //定义服务器指针
    25. QTcpServer *server;
    26. //定义客户端容器
    27. QListclientList;
    28. };
    29. #endif // WIDGET_H

    源文件:

    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. connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot);
    11. }
    12. Widget::~Widget()
    13. {
    14. delete ui;
    15. }
    16. //启动/关闭服务器按钮对应的槽函数
    17. void Widget::on_switchBtn_clicked()
    18. {
    19. if(ui->switchBtn->text()=="启动")
    20. {
    21. quint16 port=ui->portEdit->text().toUInt(); //获取ui界面上的端口号
    22. //监听客户端的连接请求
    23. if(!server->listen(QHostAddress::Any,port))
    24. {
    25. QMessageBox::information(this,"失败","监听失败");
    26. return;
    27. }
    28. else
    29. {
    30. QMessageBox::information(this,"成功","服务器启动成功");
    31. }
    32. //将按钮文本内容改成"关闭"
    33. ui->switchBtn->setText("关闭");
    34. }
    35. else
    36. {
    37. if(server->isListening())
    38. {
    39. server->close();
    40. ui->switchBtn->setText("启动");
    41. }
    42. }
    43. }
    44. //自定义处理newConnection信号的槽函数的实现
    45. void Widget::newConnection_slot()
    46. {
    47. qDebug()<<"您有新的客户端发来连接请求";
    48. //获取最新连接的客户端套接字
    49. QTcpSocket *s=server->nextPendingConnection();
    50. //将该套接字,放入客户端链表中
    51. clientList.push_back(s);
    52. connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
    53. }
    54. //readyRead信号对应槽函数的实现
    55. void Widget::readyRead_slot()
    56. {
    57. qDebug()<<"有新的客户端消息发来了";
    58. //遍历客户端链表,将无效的客户端移除
    59. for(int i=0;isize();i++)
    60. {
    61. //判断当前套接字是否是有效连接
    62. if(clientList[i]->state()==0)
    63. {
    64. //将该套接字移除客户端容器
    65. clientList.removeAt(i);
    66. }
    67. }
    68. //遍历客户端链表,判断是哪个客户端发来的消息
    69. for(int i=0;isize();i++)
    70. {
    71. if(clientList[i]->bytesAvailable()!=0)
    72. {
    73. //将该套接字中的数据读取出来
    74. QByteArray msg=clientList[i]->readAll();
    75. //将数据展示到ui界面
    76. ui->msgWidget->addItem(QString::fromLocal8Bit(msg));
    77. //将接受到的数据,转发给所有客户端
    78. for(int j=0;jsize();j++)
    79. {
    80. clientList[j]->write(msg);
    81. }
    82. }
    83. }
    84. }

    测试文件:

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

    现象:

    2、客户端

    头文件:

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. #include //客户端类
    5. #include
    6. QT_BEGIN_NAMESPACE
    7. namespace Ui { class Widget; }
    8. QT_END_NAMESPACE
    9. class Widget : public QWidget
    10. {
    11. Q_OBJECT
    12. public:
    13. Widget(QWidget *parent = nullptr);
    14. ~Widget();
    15. private slots:
    16. void on_connectBtn_clicked();
    17. void connected_slot(); //自定义处理connected信号的槽函数的声明的声明
    18. void readyRead_slot(); //自定义处理readyRead信号的槽函数的声明
    19. void disconnected_slot(); //自定义处理disconnected信号的槽函数的声明
    20. void on_sendBtn_clicked();
    21. void on_disconnectBtn_clicked();
    22. private:
    23. Ui::Widget *ui;
    24. //定义客户端指针
    25. QTcpSocket *socket;
    26. //定义字符串接受用户
    27. QString userName;
    28. };
    29. #endif // WIDGET_H

     源文件:

    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. socket=new QTcpSocket(this);
    10. connect(socket,&QTcpSocket::connected,this,&Widget::connected_slot);
    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. //连接服务器按钮对应的槽函数
    19. void Widget::on_connectBtn_clicked()
    20. {
    21. //获取ui界面上的相关信息
    22. userName=ui->userNameEdit->text(); //获取用户名
    23. QString ip=ui->ipEdit->text(); //主机地址
    24. quint16 port=ui->portEdit->text().toUInt(); //端口号
    25. //将客户端连接到给定的服务器
    26. socket->connectToHost(ip,port);
    27. }
    28. //自定义处理connected信号的槽函数的定义
    29. void Widget::connected_slot()
    30. {
    31. QMessageBox::information(this,"成功","您已经成功进入聊天室");
    32. //向服务器发送一条数据:***:进入聊天室
    33. QString msg=userName+":进入聊天室";
    34. socket->write(msg.toLocal8Bit()); //将数据写给服务器
    35. }
    36. //自定义处理readyRead信号的槽函数的定义
    37. void Widget::readyRead_slot()
    38. {
    39. //读取套接字中的信息
    40. QByteArray msg=socket->readAll();
    41. //将数据展示到ui界面
    42. ui->msgWidget->addItem(QString::fromLocal8Bit(msg));
    43. }
    44. //发送按钮对应的槽函数
    45. void Widget::on_sendBtn_clicked()
    46. {
    47. //获取ui界面输入的内容
    48. QString msg=userName+":"+ui->msgEdit->text();
    49. //发送给服务器
    50. socket->write(msg.toLocal8Bit());
    51. //清空编辑框内容
    52. ui->msgEdit->clear();
    53. }
    54. //断开服务器按钮对应的槽函数
    55. void Widget::on_disconnectBtn_clicked()
    56. {
    57. //高数大家我走了
    58. QString msg=userName+"离开聊天室";
    59. socket->write(msg.toLocal8Bit());
    60. //断开连接
    61. socket->disconnectFromHost();
    62. }
    63. //自定义处理disconnected信号的槽函数的定义
    64. void Widget::disconnected_slot()
    65. {
    66. QMessageBox::information(this,"提示","退出成功");
    67. }

    测试文件:

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

    现象:

  • 相关阅读:
    weblogic 系列漏洞
    C++红黑树
    SpringBoot + 一个注解,轻松实现 Redis 分布式锁
    进程和线程的区别&&run和start区别与联系
    Mustango——音乐领域知识生成模型探索
    gitlab添加ssh公钥
    ARM学习(10) 运行占据内存统计
    服务器相关概念1
    【20220629】【信号处理】(平稳随机信号)自相关函数性质的证明过程
    SpringMVC初级
  • 原文地址:https://blog.csdn.net/2301_77616453/article/details/133560746