• C++QT实现TCP通信


    QT中的TCP通信原理及实现

    (源码链接,在文章末)

    QT中可以通过TCP协议让服务器和客户端之间行通信。服务器和客户端的具体流程:

    A、服务器:

    本文福利, 免费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

    1. 1.创建QTcpServer对象
    2. 2.启动服务器(监听)调用成员方法listen(QHostAddress::Any,端口号)
    3. 3.当有客户端链接时候会发送newConnection信号,触发槽函数接受链接(得到一个与客户端通信的套接字QTcpSocket)
    4. 4.QTcpsocket发送数据用成员方法write
    5. 5.读数据当客户端有数据来,QTcpSocket对象就会发送readyRead信号,关联槽函数读取数据

    B、客户端 :

    1. 1.创建QTcpSocket对象
    2. 2.链接服务器connectToHost(QHostAddress("ip"),端口号)
    3. 3.QTcpsocket发送数据用成员方法write
    4. 4.读数据当对方有数据来,QTcpSocket对象就会发送readyRead信号,关联槽函数读取数据

    代码中都有详细的注释,方便读者理解,希望对你们有所帮助!

    1.服务器端

    首先为避免C++版本不一致,不能识别TCP协议中,我们得在工程文件(工程文件.pro)中的第一行添加network(若客户端与服务器端不在同一个工程文件中,两个工程文件都需要添加)

    1. #include//监听套接字
    2. #include//通信套接字

    下面直接给出服务器的 .h代码和.cpp代码

    1.serverwidget.h 

    1. #ifndef SERVERWIDGET_H
    2. #define SERVERWIDGET_H
    3. #include
    4. #include//监听套接字
    5. #include//通信套接字
    6. QT_BEGIN_NAMESPACE
    7. namespace Ui { class serverWidget; }
    8. QT_END_NAMESPACE
    9. class serverWidget : public QWidget
    10. {
    11. Q_OBJECT
    12. public:
    13. serverWidget(QWidget *parent = nullptr);
    14. ~serverWidget();
    15. private slots:
    16. void on_buttonsend_clicked();
    17. void on_buttonclose_clicked();
    18. private:
    19. Ui::serverWidget *ui;
    20. //声明两种套接字
    21. QTcpServer *tcpserver;
    22. QTcpSocket *tcpsocket;
    23. };
    24. #endif // SERVERWIDGET_H

    2.serverwidget.cpp

    1. #include "serverwidget.h"
    2. #include "ui_serverwidget.h"
    3. serverWidget::serverWidget(QWidget *parent)
    4. : QWidget(parent)
    5. , ui(new Ui::serverWidget)
    6. {
    7. ui->setupUi(this);
    8. tcpserver=nullptr;
    9. tcpsocket=nullptr;
    10. //创建监听套接字
    11. tcpserver=new QTcpServer(this);//指定父对象 回收空间
    12. //bind+listen
    13. tcpserver->listen(QHostAddress::Any,8888);//绑定当前网卡所有的ip 绑定端口 也就是设置服务器地址和端口号
    14. //服务器建立连接
    15. connect(tcpserver,&QTcpServer::newConnection,[=](){
    16. //取出连接好的套接字
    17. tcpsocket=tcpserver->nextPendingConnection();
    18. //获得通信套接字的控制信息
    19. QString ip=tcpsocket->peerAddress().toString();//获取连接的 ip地址
    20. quint16 port=tcpsocket->peerPort();//获取连接的 端口号
    21. QString temp=QString("[%1:%2] 客服端连接成功").arg(ip).arg(port);
    22. //显示连接成功
    23. ui->textEditRead->setText(temp);
    24. //接收信息 必须放到连接中的槽函数 不然tcpsocket就是一个野指针
    25. connect(tcpsocket,&QTcpSocket::readyRead,[=](){
    26. //从通信套接字中取出内容
    27. QString str=tcpsocket->readAll();
    28. //在编辑区域显示
    29. ui->textEditRead->append("客户端:"+str);//不用settext 这样会覆盖之前的消息
    30. });
    31. });
    32. }
    33. serverWidget::~serverWidget()
    34. {
    35. delete ui;
    36. }
    37. void serverWidget::on_buttonsend_clicked()
    38. {
    39. if(tcpsocket==nullptr){
    40. return ;
    41. }
    42. //获取编辑区域的内容
    43. QString str=ui->textEditWrite->toPlainText();
    44. //写入通信套接字 协议栈自动发送
    45. tcpsocket->write(str.toUtf8().data());
    46. //在编辑区域显示
    47. ui->textEditRead->append("服务器端:"+str);//不用settext 这样会覆盖之前的消息
    48. }
    49. void serverWidget::on_buttonclose_clicked()
    50. {
    51. //通信套接字主动与服务端断开连接
    52. tcpsocket->disconnectFromHost();//结束聊天
    53. //关闭 通信套接字
    54. tcpsocket->close();
    55. tcpsocket=nullptr;
    56. }

    3.serverwidget.ui 

     ​​​​

     

    2.客户端

    1.clientwidget.h

    1. #ifndef CLIENTWIDGET_H
    2. #define CLIENTWIDGET_H
    3. #include
    4. #include
    5. QT_BEGIN_NAMESPACE
    6. namespace Ui { class ClientWidget; }
    7. QT_END_NAMESPACE
    8. class ClientWidget : public QWidget
    9. {
    10. Q_OBJECT
    11. public:
    12. ClientWidget(QWidget *parent = nullptr);
    13. ~ClientWidget();
    14. private slots:
    15. void on_buttonconnect_clicked();
    16. void on_buttonsend_clicked();
    17. void on_buttonclose_clicked();
    18. private:
    19. Ui::ClientWidget *ui;
    20. QTcpSocket *tcpsocket;//声明套接字 客户端只有一个通信套接字
    21. };
    22. #endif // CLIENTWIDGET_H

    2.clientwidget.cpp 

    1. #include "clientwidget.h"
    2. #include "ui_clientwidget.h"
    3. ClientWidget::ClientWidget(QWidget *parent)
    4. : QWidget(parent)
    5. , ui(new Ui::ClientWidget)
    6. {
    7. ui->setupUi(this);
    8. tcpsocket=nullptr;
    9. setWindowTitle("客户端");
    10. tcpsocket=new QTcpSocket(this);
    11. connect(tcpsocket,&QTcpSocket::connected,[=](){
    12. ui->textEditRead->setText("服务器连接成功!");
    13. });
    14. connect(tcpsocket,&QTcpSocket::readyRead,[=](){
    15. //获取通信套接字的内容
    16. QString str=tcpsocket->readAll();
    17. //在显示编辑区域显示
    18. ui->textEditRead->append("服务器端:"+str);//不用settext 这样会覆盖之前的消息
    19. });
    20. }
    21. ClientWidget::~ClientWidget()
    22. {
    23. delete ui;
    24. }
    25. void ClientWidget::on_buttonconnect_clicked()
    26. {
    27. if(nullptr==ui->lineEditIP || nullptr==ui->lineEditPort)
    28. return ;
    29. //获取IP地址和端口号
    30. QString IP=ui->lineEditIP->text();
    31. quint16 Port=ui->lineEditPort->text().toInt();
    32. //与服务器连接
    33. tcpsocket->connectToHost(IP,Port);
    34. }
    35. void ClientWidget::on_buttonsend_clicked()
    36. {
    37. if(nullptr==tcpsocket)//连接失败则不发送
    38. return;
    39. //获取发送的信息
    40. QString str=ui->textEditWrite->toPlainText();
    41. //将信息写入到通信套接字
    42. tcpsocket->write(str.toUtf8().data());
    43. //将自己的信息显示在聊天窗口
    44. ui->textEditRead->append("客服端:"+str);//不用settext 这样会覆盖之前的消息
    45. }
    46. void ClientWidget::on_buttonclose_clicked()
    47. {
    48. if(nullptr==tcpsocket)
    49. return;
    50. tcpsocket->disconnectFromHost();//断开与服务器的连接
    51. tcpsocket->close();//关闭通信套接字
    52. }

    3.clientwidget.ui 

    效果展示

    本文福利, 免费领取Qt开发学习资料包、技术视频,内容包括(C++语言基础,Qt编程入门,QT信号与槽机制,QT图像绘制,QT网络,QT数据库编程,QT项目实战,QT嵌入式开发,Quick模块等等)↓↓↓↓↓↓见下面↓↓文章底部点击免费领取↓↓

  • 相关阅读:
    一个或多个筛选器启动失败。完整的详细信息将在相应的容器日志文件中找到
    linux 卸载php的最终方案
    MySQL的主从复制
    map与set的封装
    就业 | 面试签约问题
    Nginx服务之SSL
    银河麒麟服务器x86安装qemu虚拟机,并安装windows server 2019
    还在分不清各种IO模型?
    SpringBoot整合ElasticSearch,抓取JD数据案例
    Vue+Koa+MongoDB从零打造一个任务管理系统
  • 原文地址:https://blog.csdn.net/m0_60259116/article/details/127737723