• 复习 --- QT服务器客户端


     

    服务器

    头文件:

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. #include
    13. QT_BEGIN_NAMESPACE
    14. namespace Ui { class Widget; }
    15. QT_END_NAMESPACE
    16. class Widget : public QWidget
    17. {
    18. Q_OBJECT
    19. public:
    20. Widget(QWidget *parent = nullptr);
    21. ~Widget();
    22. private:
    23. Ui::Widget *ui;
    24. //客户端指针
    25. QTcpSocket *client;
    26. //存储用户名
    27. QString uname;
    28. //聊天框
    29. QListWidget *text;
    30. //消息发送框
    31. QLineEdit *msg;
    32. //发送按钮
    33. QPushButton *send;
    34. //用户名、
    35. QLabel *userLab;
    36. //IP
    37. QLabel *ipLab;
    38. //PORT
    39. QLabel *portLab;
    40. //用户输入框
    41. QLineEdit *unameEdit;
    42. //IP输入框
    43. QLineEdit *ipEdit;
    44. //端口输入框
    45. QLineEdit *portEdit;
    46. //连接服务器按钮
    47. QPushButton *bconnect;
    48. //断开服务器按钮
    49. QPushButton *bdisconnect;
    50. public slots:
    51. //连接按钮槽函数
    52. void connectBtn_clicked();
    53. //声明自定义处理connected信号的槽函数
    54. void connected_slot();
    55. //声明自定义处理readyRead信号的槽函数
    56. void readyRead_slot();
    57. //声明自定义处理disconnected信号的槽函数
    58. void disconnected_slot();
    59. //发送按钮槽函数
    60. void sendBtn_clicked();
    61. //断开连接槽函数
    62. void disconnectBtn_clicked();
    63. };
    64. #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. this->setFixedSize(720,680);
    9. //聊天框
    10. text = new QListWidget(this);
    11. text->setFixedSize(720,400);
    12. //消息发送框
    13. msg = new QLineEdit(this);
    14. msg->resize(500,50);
    15. msg->move(10,420);
    16. //发送按钮
    17. send = new QPushButton(this);
    18. send->setText("发送");
    19. send->resize(150,50);
    20. send->move(520,420);
    21. //用户名
    22. userLab = new QLabel(this);
    23. userLab->setText("用户名:");
    24. userLab->setAlignment(Qt::AlignCenter);
    25. userLab->resize(100,30);
    26. userLab->move(30,500);
    27. //IP
    28. ipLab = new QLabel(this);
    29. ipLab->setText("IP:");
    30. ipLab->setAlignment(Qt::AlignCenter);
    31. ipLab->resize(100,30);
    32. ipLab->move(30,550);
    33. //PORT
    34. portLab = new QLabel(this);
    35. portLab->setText("Port:");
    36. portLab->setAlignment(Qt::AlignCenter);
    37. portLab->resize(100,30);
    38. portLab->move(30,600);
    39. //用户输入框
    40. unameEdit = new QLineEdit(this);
    41. unameEdit->resize(300,30);
    42. unameEdit->move(140,500);
    43. //IP输入框
    44. ipEdit = new QLineEdit(this);
    45. ipEdit->resize(300,30);
    46. ipEdit->move(140,550);
    47. //端口输入框
    48. portEdit = new QLineEdit(this);
    49. portEdit->resize(300,30);
    50. portEdit->move(140,600);
    51. //连接服务器按钮
    52. bconnect = new QPushButton(this);
    53. bconnect->resize(120,50);
    54. bconnect->setText("连接");
    55. bconnect->move(520,500);
    56. //断开服务器按钮
    57. bdisconnect = new QPushButton(this);
    58. bdisconnect->resize(120,50);
    59. bdisconnect->setText("断开连接");
    60. bdisconnect->move(520,580);
    61. client = new QTcpSocket(this);
    62. //连接按钮信号
    63. connect(bconnect,&QPushButton::clicked,this,&Widget::connectBtn_clicked);
    64. //连接上后客户端自动发送一个connected信号,只需要连接一次
    65. connect(client,&QTcpSocket::connected,this,&Widget::connected_slot);
    66. //如果服务器有数据发送给该客户端,那么该套接字就会自动发射一个readyRead信号
    67. connect(client, &QTcpSocket::readyRead, this, &Widget::readyRead_slot);
    68. //发送按钮
    69. connect(send,&QPushButton::clicked,this,&Widget::sendBtn_clicked);
    70. //当成功与服务器断开连接后,该客户端就会自动发射一个disconnected的信号
    71. connect(client, &QTcpSocket::disconnected, this, &Widget::disconnected_slot);
    72. }
    73. Widget::~Widget()
    74. {
    75. delete ui;
    76. }
    77. //连接按钮槽函数
    78. void Widget::connectBtn_clicked()
    79. {
    80. //获取ip和端口
    81. QString ip = ipEdit->text();
    82. quint16 port = portEdit->text().toUInt();
    83. //连接主机
    84. client->connectToHost(ip,port);
    85. }
    86. //声明自定义处理connected信号的槽函数
    87. void Widget::connected_slot()
    88. {
    89. QMessageBox::information(this,"","连接服务器成功");
    90. uname = unameEdit->text();
    91. QString msgs = uname+":进入聊天室";
    92. client->write(msgs.toLocal8Bit());
    93. msg->setEnabled(true);
    94. send->setEnabled(true);
    95. bdisconnect->setEnabled(true);
    96. unameEdit->setEnabled(false);
    97. ipEdit->setEnabled(false);
    98. portEdit->setEnabled(false);
    99. bconnect->setEnabled(false);
    100. }
    101. //声明自定义处理readyRead信号的槽函数
    102. void Widget::readyRead_slot()
    103. {
    104. //接收到服务器消息后
    105. QByteArray msgbox = client->readAll();
    106. //显示
    107. text->addItem(QString::fromLocal8Bit(msgbox));
    108. }
    109. //声明自定义处理disconnected信号的槽函数
    110. void Widget::disconnected_slot()
    111. {
    112. QString msgbox = uname+":离开聊天室";
    113. client->write(msgbox.toLocal8Bit());
    114. //断开后客户端会发送一个disconnected信号
    115. client->disconnectFromHost();
    116. }
    117. //发送按钮槽函数
    118. void Widget::sendBtn_clicked()
    119. {
    120. QString msgbox = msg->text();
    121. msgbox = uname+":"+msgbox;
    122. //发送
    123. client->write(msgbox.toLocal8Bit());
    124. msg->clear();
    125. }
    126. //断开连接槽函数
    127. void Widget::disconnectBtn_clicked()
    128. {
    129. QMessageBox::information(this,"","成功断开");
    130. msg->setEnabled(false);
    131. send->setEnabled(false);
    132. bdisconnect->setEnabled(false);
    133. unameEdit->setEnabled(true);
    134. ipEdit->setEnabled(true);
    135. portEdit->setEnabled(true);
    136. bconnect->setEnabled(true);
    137. }

     

    客户端

    头文件

    1. #ifndef WIDGET_H
    2. #define WIDGET_H
    3. #include
    4. #include
    5. #include
    6. #include
    7. #include
    8. #include
    9. #include
    10. #include
    11. #include
    12. #include
    13. QT_BEGIN_NAMESPACE
    14. namespace Ui { class Widget; }
    15. QT_END_NAMESPACE
    16. class Widget : public QWidget
    17. {
    18. Q_OBJECT
    19. public:
    20. Widget(QWidget *parent = nullptr);
    21. ~Widget();
    22. private:
    23. Ui::Widget *ui;
    24. //定义服务器指针
    25. QTcpServer *server;
    26. //定义客户端容器
    27. QList socketList;
    28. //对话框
    29. QListWidget *text;
    30. //端口号
    31. QLabel * l_port;
    32. //端口输入框
    33. QLineEdit *edit_port;
    34. //启动按钮
    35. QPushButton *bstart;
    36. private slots:
    37. //按键槽函数
    38. void start_clicked();
    39. //连接槽函数
    40. void newConnection_slot();
    41. //readyRead信号处理槽函数
    42. void readyRead_slot();
    43. };
    44. #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. this->setFixedSize(680,500);
    9. //对话框
    10. text = new QListWidget(this);
    11. text->setFixedSize(680,350);
    12. //端口号
    13. l_port = new QLabel(this);
    14. l_port->setText("端口号:");
    15. l_port->resize(50,30);
    16. l_port->move(50,400);
    17. //端口输入框
    18. edit_port = new QLineEdit(this);
    19. edit_port->resize(380,30);
    20. edit_port->move(120,400);
    21. //启动按钮
    22. bstart = new QPushButton(this);
    23. bstart->setText("启动服务器");
    24. bstart->resize(100,30);
    25. bstart->move(520,400);
    26. server = new QTcpServer(this);
    27. connect(bstart,&QPushButton::clicked,this,&Widget::start_clicked);
    28. }
    29. Widget::~Widget()
    30. {
    31. delete ui;
    32. }
    33. void Widget::start_clicked()
    34. {
    35. qDebug()<<"ok"; //测试
    36. //判断输入框中是否有内容
    37. if(edit_port->text() == NULL)
    38. {
    39. QMessageBox::information(this,"错误","端口号为空!");
    40. }
    41. else
    42. {
    43. //获取输入框中的内容
    44. quint16 port = edit_port->text().toUInt();
    45. qDebug()<
    46. QString ip = "192.168.1.2";
    47. QHostAddress address(ip);
    48. //将服务器设置成监听状态,监听客户段发来的连接请求
    49. if(server->listen(QHostAddress::Any,port))
    50. {
    51. QMessageBox::information(this,"","服务器启动成功");
    52. }
    53. else
    54. {
    55. QMessageBox::information(this,"","服务器启动失败");
    56. }
    57. //此时服务器已经进入监听状态,客户段发来连接请求,服务器就会自动发射一个newConnext信号
    58. connect(server,&QTcpServer::newConnection,this,&Widget::newConnection_slot);
    59. }
    60. }
    61. void Widget::newConnection_slot()
    62. {
    63. qDebug()<<"有客户连接";
    64. //获取最新连接的客户段套接字
    65. QTcpSocket *client = server->nextPendingConnection();
    66. //将套接字放入客户端容器
    67. socketList.push_back(client);
    68. //监听套接字,有数据则客户端会发送一个readyRead信号
    69. connect(client,&QTcpSocket::readyRead,this,&Widget::readyRead_slot);
    70. }
    71. void Widget::readyRead_slot()
    72. {
    73. //移除无效客户端
    74. for (int i = 0;icount();i++)
    75. {
    76. //套接字状态为0表示无效客户端
    77. if(socketList.at(i)->state() == 0)
    78. {
    79. socketList.removeAt(i);
    80. }
    81. }
    82. //遍历套接字有消息发送给其他客户端
    83. for (int i = 0;icount();i++)
    84. {
    85. //获取套接字是否有有效数据
    86. if(socketList.at(i)->bytesAvailable() != 0)
    87. {
    88. //获取套接字内信息
    89. QByteArray msg = socketList.at(i)->readAll();
    90. text->addItem(QString::fromLocal8Bit(msg));
    91. for (int j = 0;jcount();j++)
    92. {
    93. socketList.at(j)->write(msg);
    94. }
    95. }
    96. }
    97. }
  • 相关阅读:
    flink的副输出sideoutput单元测试
    golang 中的go指针
    利用easy poi做文件导出
    JVM知识点总结
    EMM Cause #40 No EPS bearer context activated介绍
    学生HTML个人网页作业作品:基于web在线汽车网站的设计与实现 (宝马轿车介绍)
    AP360X 3D小夜灯 拍拍灯 智能充电 LED照明 手电筒驱动IC LED指示灯
    如何看待Java是一门半编译半解释型的语言(企业真题)
    广西民族大学计算机考研资料汇总
    python-sklearn模型通用方法的介绍
  • 原文地址:https://blog.csdn.net/weixin_61882921/article/details/133606093