• QT 实现服务器客户端搭建


    1. 服务器头文件

    1. #ifndef SER_H
    2. #define SER_H
    3. #include
    4. #include //服务器头文件
    5. #include //客户端头文件
    6. #include //消息对话框
    7. #include //链表头文件
    8. QT_BEGIN_NAMESPACE
    9. namespace Ui { class Ser; }
    10. QT_END_NAMESPACE
    11. class Ser : public QWidget
    12. {
    13. Q_OBJECT
    14. public:
    15. Ser(QWidget *parent = nullptr);
    16. ~Ser();
    17. private slots:
    18. void on_connectbtn_clicked();
    19. void newConnection_slot(); //处理newConnection信号的槽函数
    20. void readyRead_slot(); //处理readyRead信号的槽函数
    21. private:
    22. Ui::Ser *ui;
    23. QTcpServer *server; //定义服务器指针
    24. QList clientList; //定义客户端容器
    25. };
    26. #endif // SER_H

    2.  服务器源文件

    1. #include "ser.h"
    2. #include "ui_ser.h"
    3. Ser::Ser(QWidget *parent)
    4. : QWidget(parent)
    5. , ui(new Ui::Ser)
    6. {
    7. ui->setupUi(this);
    8. server=new QTcpServer(this); //实例化一个服务器
    9. connect(server,&QTcpServer::newConnection,this,&Ser::newConnection_slot);
    10. }
    11. Ser::~Ser()
    12. {
    13. delete ui;
    14. }
    15. //启动服务器按钮对应的槽函数
    16. void Ser::on_connectbtn_clicked()
    17. {
    18. quint16 port=ui->portbtn->text().toUInt();
    19. if(server->listen(QHostAddress::Any,port)){
    20. QMessageBox::information(this,"成功","服务器启动成功");
    21. }
    22. else{
    23. QMessageBox::information(this,"失败","服务器启动失败");
    24. return;
    25. }
    26. }
    27. //处理newConnection信号的槽函数
    28. void Ser::newConnection_slot(){
    29. QTcpSocket *s=server->nextPendingConnection(); //获取最新连接的客户端套接字
    30. clientList.push_back(s); //将套接字放入客户端链表中
    31. connect(s,&QTcpSocket::readyRead,this,&Ser::readyRead_slot);
    32. }
    33. //处理readyRead信号的槽函数
    34. void Ser::readyRead_slot(){
    35. for(int i=0;icount();i++){
    36. if(clientList[i]->state()==0){
    37. clientList.removeAt(i);
    38. }
    39. }
    40. for(int i=0;icount();i++){
    41. if(clientList[i]->bytesAvailable()!=0){
    42. QByteArray msg=clientList[i]->readAll();
    43. ui->msgwidget->addItem(QString::fromLocal8Bit(msg));
    44. for(int j=0;jcount();j++){
    45. clientList[j]->write(msg);
    46. }
    47. }
    48. }
    49. }

    3. 客户端头文件

    1. #ifndef CLI_H
    2. #define CLI_H
    3. #include
    4. #include //客户端头文件
    5. #include //消息对话框
    6. QT_BEGIN_NAMESPACE
    7. namespace Ui { class cli; }
    8. QT_END_NAMESPACE
    9. class cli : public QWidget
    10. {
    11. Q_OBJECT
    12. public:
    13. cli(QWidget *parent = nullptr);
    14. ~cli();
    15. private slots:
    16. void on_connectbtn_clicked();
    17. void on_sendbtn_clicked();
    18. void on_disconnectbtn_clicked();
    19. void connected_slot(); //处理connected信号的槽函数
    20. void readyRead_slot(); //处理readyRead信号的槽函数
    21. void disconnected_slot(); //处理disconnected信号的槽函数
    22. private:
    23. Ui::cli *ui;
    24. QTcpSocket *socket; //定义客户端指针
    25. QString username; //用户名
    26. };
    27. #endif // CLI_H

    4.客户端源文件

    1. #include "cli.h"
    2. #include "ui_cli.h"
    3. cli::cli(QWidget *parent)
    4. : QWidget(parent)
    5. , ui(new Ui::cli)
    6. {
    7. ui->setupUi(this);
    8. socket=new QTcpSocket(this); //实例化一个客户端
    9. ui->disconnectbtn->setEnabled(false);
    10. ui->sendbtn->setEnabled(false);
    11. ui->msgedit->setEnabled(false);
    12. connect(socket,&QTcpSocket::connected,this,&cli::connected_slot);
    13. connect(socket,&QTcpSocket::readyRead,this,&cli::readyRead_slot);
    14. connect(socket, &QTcpSocket::disconnected, this, &cli::disconnected_slot);
    15. }
    16. cli::~cli()
    17. {
    18. delete ui;
    19. }
    20. //连接服务器按钮对应的槽函数
    21. void cli::on_connectbtn_clicked()
    22. {
    23. username=ui->usernameedit->text();
    24. QString ip=ui->ipedit->text();
    25. quint16 port=ui->portedit->text().toUInt();
    26. socket->connectToHost(ip,port);
    27. }
    28. //处理connected信号的槽函数
    29. void cli::connected_slot(){
    30. ui->disconnectbtn->setEnabled(true);
    31. ui->sendbtn->setEnabled(true);
    32. ui->msgedit->setEnabled(true);
    33. ui->usernameedit->setEnabled(false);
    34. ui->ipedit->setEnabled(false);
    35. ui->portedit->setEnabled(false);
    36. ui->connectbtn->setEnabled(false);
    37. QMessageBox::information(this,"成功","成功进入聊天室");
    38. QString msg=username+": 进入聊天室";
    39. socket->write(msg.toLocal8Bit());
    40. }
    41. //处理readyRead信号的槽函数
    42. void cli::readyRead_slot(){
    43. QByteArray msg=socket->readAll();
    44. ui->msgwidget->addItem(QString::fromLocal8Bit(msg));
    45. }
    46. //发送信息按钮对应的槽函数
    47. void cli::on_sendbtn_clicked()
    48. {
    49. QString msg=username+": "+ui->msgedit->text();
    50. socket->write(msg.toLocal8Bit());
    51. ui->msgedit->clear();
    52. }
    53. //断开服务器按钮对应的槽函数
    54. void cli::on_disconnectbtn_clicked()
    55. {
    56. QString msg=username+": 离开聊天室";
    57. socket->write(msg.toLocal8Bit());
    58. socket->disconnectFromHost();
    59. }
    60. //处理disconnected信号的槽函数
    61. void cli::disconnected_slot(){
    62. ui->disconnectbtn->setEnabled(false);
    63. ui->sendbtn->setEnabled(false);
    64. ui->msgedit->setEnabled(false);
    65. ui->usernameedit->setEnabled(true);
    66. ui->ipedit->setEnabled(true);
    67. ui->portedit->setEnabled(true);
    68. ui->connectbtn->setEnabled(true);
    69. QMessageBox::information(this,"退出","退出成功");
    70. }

  • 相关阅读:
    构建有效和安全的远程工作模式
    (附源码)springboot学生宿舍管理系统 毕业设计 211955
    元数据管理平台对比预研 Atlas VS Datahub VS Openmetadata
    如何借助python第三方库存取不同应用程序的用户名、密码
    java培训之什么时候必须配置
    HTTP 参数污染 (HPP) 和 HTTP 参数碎片 (HPF)
    APO的全面进化之路(2):走向IBP、建设端到端供应链计划体系
    全量知识系统问题及SmartChat给出的答复 之19 关于演示模板
    【原创分享】详述中间件的前世今生
    FreeRTOS入门教程(队列详细使用示例)
  • 原文地址:https://blog.csdn.net/2301_78047404/article/details/133611883