基于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(); }
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持我们。
赞 (0)