基于Qt的TCP实现通信

本文实例为大家分享了基于Qt的TCP实现通信的具体代码,供大家参考,具体内容如下
一、tcp介绍
TCP是面向连接的可靠传输的协议,协议规定通信的双方是服务端和客户端的两个角色:
服务端:负责监听网络端口,等待客户端的连接,用连接的socket完成信息的交互;
客户端:负责每次连接的发起,建立连接后才可以进行通信;
二、界面设计
服务器端
基于Qt的TCP实现通信
文章图片

客户端
基于Qt的TCP实现通信
文章图片

三、具体程序设计
(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()<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=https://www.it610.com/article/ui->sendText->toPlainText(); //发送数据为文本框的的内容tcpSocket->write(sendData.toLocal8Bit()); tcpSocket->flush(); ui->sendText->clear(); }

【基于Qt的TCP实现通信】以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

    推荐阅读