当前位置:   article > 正文

QT 实现服务器客户端搭建_服务器安装qt

服务器安装qt

1. 服务器头文件

  1. #ifndef SER_H
  2. #define SER_H
  3. #include <QWidget>
  4. #include<QTcpServer> //服务器头文件
  5. #include<QTcpSocket> //客户端头文件
  6. #include<QMessageBox> //消息对话框
  7. #include<QList> //链表头文件
  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<QTcpSocket *> 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;i<clientList.count();i++){
  36. if(clientList[i]->state()==0){
  37. clientList.removeAt(i);
  38. }
  39. }
  40. for(int i=0;i<clientList.count();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;j<clientList.count();j++){
  45. clientList[j]->write(msg);
  46. }
  47. }
  48. }
  49. }

3. 客户端头文件

  1. #ifndef CLI_H
  2. #define CLI_H
  3. #include <QWidget>
  4. #include<QTcpSocket> //客户端头文件
  5. #include<QMessageBox> //消息对话框
  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. }

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/2023面试高手/article/detail/356669
推荐阅读
相关标签
  

闽ICP备14008679号