基于Qt的TCP实现通信

 更新时间:2022年08月23日 08:42:45   作者:遇安啊  
这篇文章主要为大家详细介绍了基于Qt的TCP实现通信,文中示例代码介绍的非常详细,具有一定的参考价值,感兴趣的小伙伴们可以参考一下

本文实例为大家分享了基于Qt的TCP实现通信的具体代码,供大家参考,具体内容如下

一、tcp介绍

TCP是面向连接的可靠传输的协议,协议规定通信的双方是服务端和客户端的两个角色:
服务端:负责监听网络端口,等待客户端的连接,用连接的socket完成信息的交互;
客户端:负责每次连接的发起,建立连接后才可以进行通信;

二、界面设计

服务器端

客户端

三、具体程序设计

(1)服务器端设计

1、建立一个工程,工程名为tcpserver,类名为server。在.pro文件中加入如下代码并保存。

QT       += network

2、进入server.h,添加类的前置声明

class QTcpServer;   //QTcpServer类的前置声明
class QTcpSocket;   //QTcpSocket类的前置声明

添加私有对象指针

QTcpServer *tcpServer;          //添加QTcpServer私有对象指针
QTcpSocket *socket;             //添加QTcpSocket私有对象指针

添加私有槽声明

 void tcpServer_connect();       //连接函数
 void read_data();               //读取从client发来的信息
 void disconnected();            //断开连接
 void on_sendButton_clicked();   //发送数据函数

3、转到server.cpp文件中

添加头文件#include,然后编写构造函数构造函数

Server::Server(QWidget *parent) :            //构造函数
    QDialog(parent),
    ui(new Ui::Server)
{
    ui->setupUi(this);
    tcpServer = new QTcpServer(this);                                             //创建对象
    if(!tcpServer->listen(QHostAddress::LocalHost,6666))                          //调用listen监听到来的连接,一旦有客户端连接到服务器,就发射newConnection信号
    {
        qDebug()<<tcpServer->errorString();
        close();
    }
    ui->sendButton->setEnabled(false);                                            // 设置按钮初始值值为false状态,即不可用
    connect(tcpServer,&QTcpServer::newConnection,this,&Server::tcpServer_connect);//将newConnection信号与槽函数连接起来
}

槽函数

//发送数据槽函数
void Server::on_sendButton_clicked()
{
    socket->write(ui->sendText->toPlainText().toLocal8Bit());      //通过write函数发送数据
    socket->flush();
    ui->sendText->clear();
}

//确认连接
void Server::tcpServer_connect()
{
    socket=tcpServer->nextPendingConnection();
    QObject::connect(socket,&QTcpSocket::readyRead,this,&Server::read_data);    //当接收缓冲区有信号到来时,产生readyRead信号
    QObject::connect(socket,&QTcpSocket::disconnected,this,&Server::disconnected);//当接收到dinconnected信号时,执行disconnected函数
    ui->sendButton->setEnabled(true);          //按钮设置为有效
    ui->label->setText(tr("连接成功!"));
}

//读取客户端发送的数据
void Server::read_data()
{
    QByteArray buffer=socket->readAll();           //读取的数据放入QByteArray对象中
    ui->recText->append(QString::fromLocal8Bit(buffer));       //将数据显示出来
}

void Server::disconnected()
{
    ui->sendButton->setEnabled(false);        //断开连接后按钮值设置为无效
}

(2)客户端设计

1、建立一个工程,工程名为tcpclient,类名为client。在.pro文件中加入如下代码并保存。

QT       += network

2、进入client.h,添加类的前置声明

class QTcpSocket;     //QTcpSocket类的前置声明

定义一个套接字对象指针

QTcpSocket *tcpSocket;       //定义一个套接字对象指针

添加私有槽函数声明

 void readData();                 //读取函数
 void discon();                   //断开连接
 void on_connectButton_clicked(); //连接按钮槽函数
 void on_sendButton_clicked();    //发送按钮槽函数

3、转到client.cpp,

添加头文件#include,并编写构造函数

Client::Client(QWidget *parent) :
    QDialog(parent),
    ui(new Ui::Client)
{
    ui->setupUi(this);
    tcpSocket = new QTcpSocket(this);          //定义套接字对象

    //关联信号到自定义的槽上
    QObject::connect(tcpSocket,&QTcpSocket::readyRead,this,&Client::readData);          //有接收数据时,执行读函数
    QObject::connect(tcpSocket,&QTcpSocket::disconnected,this,&Client::discon);
    ui->sendButton->setEnabled(false);
}

槽函数

void Client::discon()
{
    ui->sendButton->setEnabled(false);
    ui->connectButton->setText(tr("取消连接"));

}

//点击连接按钮,开始创建连接
void Client::on_connectButton_clicked()
{
    if(ui->connectButton->text()==tr("连接"))
    {
        tcpSocket->abort();
        tcpSocket->connectToHost(ui->hostLineEdit->text(),ui->portLineEdit->text().toInt());//连接到指定主机的端口
        if(!tcpSocket->waitForConnected(30000))                                             //超时连接失败
        {
            qDebug()<<"Connection failed!";
            return;
        }
        qDebug()<<"Connection successfully!";
        ui->connectButton->setText("取消连接");
        ui->sendButton->setEnabled(true);
    }
    else
    {
        tcpSocket->disconnectFromHost();
        ui->connectButton->setText("连接");
        ui->sendButton->setEnabled(false);
    }
}

//点击发送数据
void Client::on_sendButton_clicked()
{
    QString sendData=ui->sendText->toPlainText();                                           //发送数据为文本框的的内容
    tcpSocket->write(sendData.toLocal8Bit());
    tcpSocket->flush();
    ui->sendText->clear();
}

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • C++ TensorflowLite模型验证的过程详解

    C++ TensorflowLite模型验证的过程详解

    这篇文章给大家介绍了C++ TensorflowLite模型验证的过程,测试代码,主要是RunInference()和read_file(),详细操作过程跟随小编一起看看吧
    2021-08-08
  • 浅谈c++中“::”和“:” 冒号的意思

    浅谈c++中“::”和“:” 冒号的意思

    这篇文章主要介绍了浅谈c++中“::”和“:” 冒号的意思,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-06-06
  • C++数据结构之链表的创建

    C++数据结构之链表的创建

    这篇文章主要介绍了C++数据结构之链表的创建的相关资料,希望通过本文帮助到大家,让大家理解掌握这部分内容,需要的朋友可以参考下
    2017-10-10
  • C++宽字符与普通字符的转换实例详解

    C++宽字符与普通字符的转换实例详解

    这篇文章主要介绍了C++宽字符与普通字符的转换实例详解的相关资料,需要的朋友可以参考下
    2017-06-06
  • c/c++获取系统时间函数的方法示例

    c/c++获取系统时间函数的方法示例

    这篇文章主要介绍了c/c++获取系统时间函数的方法示例,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2020-02-02
  • C语言中qsort函数用法及用冒泡排序实现

    C语言中qsort函数用法及用冒泡排序实现

    qsort函数是由C语言提供的标准库函数, 它的实现思想是快速排序。这篇文章主要介绍了C语言中qsort函数用法及用冒泡排序实现qsort函数功能,需要的可以参考一下
    2022-10-10
  • C++中std::invalid_argument报错解决

    C++中std::invalid_argument报错解决

    在C++编程中,std::invalid_argument是一个常见的异常,用于指示函数参数无效,文章详细解析了这一异常的产生原因,并提供了多种解决策略,感兴趣的可以了解一下
    2024-09-09
  • C语言非递归算法解决快速排序与归并排序产生的栈溢出

    C语言非递归算法解决快速排序与归并排序产生的栈溢出

    上期我们讲完了排序算法下,不知道小伙伴们有没有发现一个问题,快速排序和归并排序我们都是用递归来实现的,可能有小伙伴会问,如果说数据量很多话,栈区空间会不会不够用呢?这期我们就来解决使用递归实现的排序导致栈溢出如何解决
    2022-04-04
  • C++深入学习之彻底理清重载函数匹配

    C++深入学习之彻底理清重载函数匹配

    C++ 不允许变量重名,但是允许多个函数取相同的名字,只要参数表不同即可,这叫作函数的重载,下面这篇文章主要给大家介绍了关于C++深入学习之彻底理清重载函数匹配的相关资料,需要的朋友可以参考下
    2019-01-01
  • C语言多功能动态通讯录实现示例

    C语言多功能动态通讯录实现示例

    这篇文章主要为大家介绍了C语言多功能动态通讯录实现示例详解,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2023-01-01

最新评论