• 国庆作业day10.4


    QT实现TCP服务器客户端搭建的代码,现象

    服务器

    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_startBtn_clicked()
    18. {
    19. quint16 port =ui->portEdit->text().toUInt();
    20. //监听客户端的链接请求
    21. if(!server->listen(QHostAddress::Any,port))
    22. {
    23. QMessageBox::information(this,"失败","监听失败");
    24. return;
    25. }else
    26. {
    27. QMessageBox::information(this,"成功","服务器启动成功");
    28. }
    29. //由于只需要链接一次即可将该链接放在构造函数中
    30. //函数原型
    31. }
    32. //自定义newConnection信号的槽函数的实现
    33. void Widget::newConnection_slot()
    34. {
    35. qDebug()<<"您有新的客户端发来链接请求了";
    36. //获取最新链接的客户端套接字
    37. QTcpSocket *s= server->nextPendingConnection();
    38. //将该套接字,放入客户端链表中
    39. clientList.push_back(s);
    40. //至此,多个客户端已经跟服务器建立链接,并放入客户端容器中了
    41. //此时,如果有客户端向服务器发来数
    42. //我们可以将该信号链接自定义的槽函数中,处理相关逻辑
    43. connect(s,&QTcpSocket::readyRead,this,&Widget::readyRead_solt);
    44. }
    45. //readyRead对应槽函数
    46. void Widget::readyRead_solt()
    47. {
    48. qDebug()<<"有新的客户端发来消息了";
    49. //遍历客户端链表,将无效的客户端移除
    50. for(int i=0;isize();i++)
    51. {
    52. //判断当前套接字是否是有效连接
    53. //函数原型:SockentState state() const;
    54. //返回0是无效连接
    55. if( clientList[i]->state()==0)
    56. {
    57. //将该无效套接字移除
    58. clientList.removeAt(i);
    59. }
    60. }
    61. //遍历客户端链表查询是哪个客户端发来的信息
    62. for(int i=0;isize();i++)
    63. {
    64. //函数原型
    65. //功能:求当前客户端套接字中待读数据的字节数
    66. //返回值0说明无数据可读
    67. if(clientList[i]->bytesAvailable()!=0)
    68. {
    69. //将该套接字中的数据读取出来
    70. QByteArray msg=clientList[i]->readAll();
    71. ui->msgWidget->addItem(QString::fromLocal8Bit(msg));
    72. for(int j=0;jsize();j++)
    73. {
    74. clientList[j]->write(msg);
    75. }
    76. }
    77. }
    78. }
    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_startBtn_clicked();
    20. void newConnection_slot();//自定义处理newconnet槽函数的申明
    21. void readyRead_solt();
    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. socket =new QTcpSocket(this);
    10. connect(socket,&QTcpSocket::connected,this,&Widget::connect_slot);
    11. connect(socket,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
    12. }
    13. Widget::~Widget()
    14. {
    15. delete ui;
    16. }
    17. //连接服务器按钮对应的槽函数
    18. void Widget::on_connectBtn_clicked()
    19. {
    20. //将客户端连接到给定的服务器
    21. //1.服务器的主机地址,2端口号
    22. userName=ui->usernameEdit->text();//用户名
    23. QString ip=ui->ipEdit->text();//ip
    24. quint16 port=ui->portEdit->text().toUInt();//端口号
    25. socket->connectToHost(ip,port);
    26. }
    27. //
    28. void Widget::connect_slot()
    29. {
    30. QMessageBox::information(this,"成功","您已连接服务器");
    31. //向服务器发送一条数据:***:进入聊天室
    32. QString msg=userName+":进入聊天室";
    33. socket->write(msg.toLocal8Bit());//将数据写给服务器
    34. }
    35. //处理readyRead信号的槽函数的定义
    36. void Widget::readyRead_slot()
    37. {
    38. //读取套接字中的信息
    39. QByteArray msg=socket->readAll();
    40. //将数据展示到ui界面
    41. ui->msgWidget->addItem(QString::fromLocal8Bit(msg));
    42. }
    43. void Widget::on_sendBtn_clicked()
    44. {
    45. //获取ui界面输入的内容
    46. QString msg=userName+":"+ui->msgEdit->text();
    47. socket->write(msg.toLocal8Bit());
    48. ui->msgEdit->clear();
    49. }
    50. //断开服务器按钮
    51. void Widget::on_disconnectBtn_clicked()
    52. {
    53. QString msg=userName+":离开聊天室";
    54. socket->write(msg.toLocal8Bit());
    55. //断开连接
    56. //函数原型:virtual void disconnectFromHost()
    57. //connect(socket,&QTcpSocket::disconnected,this,&Widget::disconnected_slot);
    58. socket->disconnectFromHost();
    59. }
    60. void Widget::disconnected_slot()
    61. {
    62. QMessageBox::information(this,"提示","退出成功");
    63. }
    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 connect_slot();
    18. void readyRead_slot();
    19. void on_sendBtn_clicked();
    20. void on_disconnectBtn_clicked();
    21. void disconnected_slot();
    22. private:
    23. Ui::Widget *ui;
    24. //客户端指针
    25. QTcpSocket * socket;
    26. //定义字符串接受用户
    27. QString userName;
    28. };
    29. #endif // WIDGET_H

  • 相关阅读:
    指定cv::cuda::GpuMat创建所在的GPU卡
    hadoop集群搭建
    java基于springboot社区共享食堂订餐信息系统maven
    24位AD分辨率、256Ksps*16通道国产数据采集卡、uV级采集、支持IEPE
    【Python】入门(三):在jupyterlab中使用conda虚拟环境
    AIGC是不是有点虎头蛇尾
    9.17 校招 实习 内推 面经
    大模型能力
    JavaScript高级
    PHP:背包问题算法(附完整源码)
  • 原文地址:https://blog.csdn.net/HYL1234511/article/details/133560998