千家信息网

QT5如何实现简单的TCP通信

发表于:2026-10-31 作者:千家信息网编辑
千家信息网最后更新 2026年10月31日,这篇文章主要介绍"QT5如何实现简单的TCP通信",在日常操作中,相信很多人在QT5如何实现简单的TCP通信问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"QT5如何实现
千家信息网最后更新 2026年10月31日QT5如何实现简单的TCP通信

这篇文章主要介绍"QT5如何实现简单的TCP通信",在日常操作中,相信很多人在QT5如何实现简单的TCP通信问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答"QT5如何实现简单的TCP通信"的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

使用QT的网络套接字需要.pro文件中加入一句:

QT += network

一、客户端

1、客户端的代码比服务器稍简单,总的来说,使用QT中的QTcpSocket类与服务器进行通信只需要以下5步:

(1)创建QTcpSocket套接字对象

socket = new QTcpSocket();

(2)使用这个对象连接服务器

socket->connectToHost(IP, port);

(3)使用write函数向服务器发送数据

socket->write(data);

(4)当socket接收缓冲区有新数据到来时,会发出readRead()信号,因此为该信号添加槽函数以读取数据

QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data); void MainWindow::socket_Read_Data(){    QByteArray buffer;    //读取缓冲区数据    buffer = socket->readAll();}

(5)断开与服务器的连接(关于close()和disconnectFromHost()的区别,可以按F1看帮助)

socket->disconnectFromHost();

2、以下是客户端的例程

首先是mainwindow.h文件:

//mainwindow.h#ifndef MAINWINDOW_H#define MAINWINDOW_H #include #include  namespace Ui {class MainWindow;} class MainWindow : public QMainWindow{    Q_OBJECT public:    explicit MainWindow(QWidget *parent = 0);    ~MainWindow(); private slots:     void on_pushButton_Connect_clicked();     void on_pushButton_Send_clicked();     void socket_Read_Data();     void socket_Disconnected(); private:    Ui::MainWindow *ui;    QTcpSocket *socket;}; #endif // MAINWINDOW_H

然后是mainwindow.cpp文件:

//mainwindow.cpp#include "mainwindow.h"#include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::MainWindow){    ui->setupUi(this);     socket = new QTcpSocket();     //连接信号槽    QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data);    QObject::connect(socket, &QTcpSocket::disconnected, this, &MainWindow::socket_Disconnected);     ui->pushButton_Send->setEnabled(false);    ui->lineEdit_IP->setText("127.0.0.1");    ui->lineEdit_Port->setText("8765"); } MainWindow::~MainWindow(){    delete this->socket;    delete ui;} void MainWindow::on_pushButton_Connect_clicked(){    if(ui->pushButton_Connect->text() == tr("连接"))    {        QString IP;        int port;         //获取IP地址        IP = ui->lineEdit_IP->text();        //获取端口号        port = ui->lineEdit_Port->text().toInt();         //取消已有的连接        socket->abort();        //连接服务器        socket->connectToHost(IP, port);         //等待连接成功        if(!socket->waitForConnected(30000))        {            qDebug() << "Connection failed!";            return;        }        qDebug() << "Connect successfully!";         //发送按键使能        ui->pushButton_Send->setEnabled(true);        //修改按键文字        ui->pushButton_Connect->setText("断开连接");    }    else    {        //断开连接        socket->disconnectFromHost();        //修改按键文字        ui->pushButton_Connect->setText("连接");        ui->pushButton_Send->setEnabled(false);    }} void MainWindow::on_pushButton_Send_clicked(){    qDebug() << "Send: " << ui->textEdit_Send->toPlainText();     //获取文本框内容并以ASCII码形式发送    socket->write(ui->textEdit_Send->toPlainText().toLatin1());    socket->flush();} void MainWindow::socket_Read_Data(){    QByteArray buffer;    //读取缓冲区数据    buffer = socket->readAll();    if(!buffer.isEmpty())    {        QString str = ui->textEdit_Recv->toPlainText();        str+=tr(buffer);        //刷新显示        ui->textEdit_Recv->setText(str);    }} void MainWindow::socket_Disconnected(){    //发送按键失能    ui->pushButton_Send->setEnabled(false);    //修改按键文字    ui->pushButton_Connect->setText("连接");    qDebug() << "Disconnected!";}

最后是ui的设计:

二、服务器

1、服务器除了使用到了QTcpSocket类,还需要用到QTcpSever类。即便如此,也只是比客户端复杂一点点,用到了6个步骤:

(1)创建QTcpSever对象

server = new QTcpServer();

(2)侦听一个端口,使得客户端可以使用这个端口访问服务器

server->listen(QHostAddress::Any, port);

(3)当服务器被客户端访问时,会发出newConnection()信号,因此为该信号添加槽函数,并用一个QTcpSocket对象接受客户端访问

connect(server,&QTcpServer::newConnection,this,&MainWindow::server_New_Connect); void MainWindow::server_New_Connect(){    //获取客户端连接    socket = server->nextPendingConnection();}

(4)使用socket的write函数向客户端发送数据

socket->write(data);

(5)当socket接收缓冲区有新数据到来时,会发出readRead()信号,因此为该信号添加槽函数以读取数据

QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data); void MainWindow::socket_Read_Data(){    QByteArray buffer;    //读取缓冲区数据    buffer = socket->readAll();}

(6)取消侦听

server->close();

2、以下是服务器的例程

首先是mainwindow.h文件:

//mainwindow.h#ifndef MAINWINDOW_H#define MAINWINDOW_H #include #include #include  namespace Ui {class MainWindow;} class MainWindow : public QMainWindow{    Q_OBJECT public:    explicit MainWindow(QWidget *parent = 0);    ~MainWindow(); private slots:    void on_pushButton_Listen_clicked();     void on_pushButton_Send_clicked();     void server_New_Connect();     void socket_Read_Data();     void socket_Disconnected(); private:    Ui::MainWindow *ui;    QTcpServer* server;    QTcpSocket* socket;}; #endif // MAINWINDOW_H

然后是mainwindow.cpp文件:

#include "mainwindow.h"#include "ui_mainwindow.h" MainWindow::MainWindow(QWidget *parent) :    QMainWindow(parent),    ui(new Ui::MainWindow){    ui->setupUi(this);     ui->lineEdit_Port->setText("8765");    ui->pushButton_Send->setEnabled(false);     server = new QTcpServer();     //连接信号槽    connect(server,&QTcpServer::newConnection,this,&MainWindow::server_New_Connect);} MainWindow::~MainWindow(){    server->close();    server->deleteLater();    delete ui;} void MainWindow::on_pushButton_Listen_clicked(){    if(ui->pushButton_Listen->text() == tr("侦听"))    {        //从输入框获取端口号        int port = ui->lineEdit_Port->text().toInt();         //监听指定的端口        if(!server->listen(QHostAddress::Any, port))        {            //若出错,则输出错误信息            qDebug()<errorString();            return;        }        //修改按键文字        ui->pushButton_Listen->setText("取消侦听");        qDebug()<< "Listen succeessfully!";    }    else    {/*        //如果正在连接(点击侦听后立即取消侦听,若socket没有指定对象会有异常,应修正--2017.9.30)        if(socket->state() == QAbstractSocket::ConnectedState)        {            //关闭连接            socket->disconnectFromHost();        }*/        socket->abort();        //取消侦听        server->close();        //修改按键文字        ui->pushButton_Listen->setText("侦听");        //发送按键失能        ui->pushButton_Send->setEnabled(false);    } } void MainWindow::on_pushButton_Send_clicked(){    qDebug() << "Send: " << ui->textEdit_Send->toPlainText();    //获取文本框内容并以ASCII码形式发送    socket->write(ui->textEdit_Send->toPlainText().toLatin1());    socket->flush();} void MainWindow::server_New_Connect(){    //获取客户端连接    socket = server->nextPendingConnection();    //连接QTcpSocket的信号槽,以读取新数据    QObject::connect(socket, &QTcpSocket::readyRead, this, &MainWindow::socket_Read_Data);    QObject::connect(socket, &QTcpSocket::disconnected, this, &MainWindow::socket_Disconnected);    //发送按键使能    ui->pushButton_Send->setEnabled(true);     qDebug() << "A Client connect!";} void MainWindow::socket_Read_Data(){    QByteArray buffer;    //读取缓冲区数据    buffer = socket->readAll();    if(!buffer.isEmpty())    {        QString str = ui->textEdit_Recv->toPlainText();        str+=tr(buffer);        //刷新显示        ui->textEdit_Recv->setText(str);    }} void MainWindow::socket_Disconnected(){    //发送按键失能    ui->pushButton_Send->setEnabled(false);    qDebug() << "Disconnected!";}

最后是ui的设计:

三、运行结果

到此,关于"QT5如何实现简单的TCP通信"的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注网站,小编会继续努力为大家带来更多实用的文章!

服务器 服务 客户 数据 信号 按键 客户端 通信 函数 文件 文字 缓冲区 缓冲 对象 学习 端口 帮助 内容 口号 套接字 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 互联网是第几次科技革命的成果 互联网科技垄断 上游互联网科技 苏州大垚互联网科技 四川狮子座互联网科技 哈尔滨秒房互联网科技有限公司 银川新华互联网科技学校地址 茂名市互联网科技产业园 互联网金融科技公司干啥的 上海宁丞科技互联网 辽宁互联网新科技 银川新华互联网科技学校联系电话 浙南科技城互联网大厦建设工程 互联网金融科技元年 2021世界互联网领先科技成果发布 广东鹅鹅鹅互联网科技有限公司 福建互联网展示科技馆设计 吉林省码上互联网科技电话 互联网科技收购价值 恒生互联网科技趋势 深圳互联网科技公司 上海致骋互联网科技 沃里互联网科技 成都狮子座互联网科技 互联网科技项目计划书材料类 福建科技产业互联网发展 广州市恰铎互联网科技有限公司 996高科技互联网公司 佛山市拉法互联网科技有限公司 上海互联网科技园景观
0