tcp通信是qt开发中常用的通信方式,这里把项目中使用的过程记录一下备忘。
1.首先在.h文件中引用头文件
#include <QTcpSocket>同样在头文件中定义一个socket变量:
private:
QTcpSocket *tcpSocket;
声明槽函数,下面会用到
private slots:void HasConnected();void HasDisconnected();void error();void RecCmdData();
2.在cpp文件中初始化变量,并绑定函数:
tcpSocket = new QTcpSocket(this);//主要的四个函数绑定,这四个函数需要在头文件中声明一下
connect(tcpSocket,SIGNAL(connected()),this,SLOT(HasConnected()));connect(tcpSocket,SIGNAL(disconnected()),this,SLOT(HasDisconnected()));connect(tcpSocket,SIGNAL(error(QAbstractSocket::SocketError)),this,SLOT(error()));connect(tcpSocket,SIGNAL(readyRead()),this,SLOT(RecCmdData()));3.函数实现:
//tcp连接函数,从界面获取ip和端口,用connecttohost函数发起连接
void Forward::on_Con_pushButton_clicked(){proxima = true;tcpSocket->abort();ui->Sta_lineEdit->setText("正在连接...");ui->Sta_lineEdit->setStyleSheet("color:black");tcpSocket->connectToHost(ui->Ip_lineEdit->text(),ui->Por_lineEdit->text().toInt());}//连接成功函数
void Forward::HasConnected(){
ui->Sta_lineEdit->setText("连接成功!");ui->Sta_lineEdit->setStyleSheet("color:black");}//断开连接
void Forward::HasDisconnected(){ui->Sta_lineEdit->setText("连接已断开!");ui->Sta_lineEdit->setStyleSheet("color:red");}//连接失败
void Forward::error(){ui->Sta_lineEdit->setText("连接失败!");ui->Sta_lineEdit->setStyleSheet("color:red");}
//断开连接的按钮操作 void Forward::on_Cut_pushButton_clicked() { //断开连接 tcpSocket->abort(); }
//最后一个最关键的函数就是数据接收函数,当收到数据后会进入前面绑定的RecCmdData()函数
//任务接收数据
void Forward::RecCmdData(){QFile rec_file("tmp/receive.txt");//收到的内容,包含12个字节的头QFile rec_xml("tmp/receive.xml");int cnt = 0;char *buffer;char *buffer_xml;if(!rec_file.open(QIODevice::ReadWrite | QIODevice::Truncate))return;if(!rec_xml.open(QIODevice::ReadWrite | QIODevice::Truncate))return;while(tcpSocket->bytesAvailable()){
QByteArray vTemp;vTemp = tcpSocket->readAll();rec_file.write(vTemp);
cnt = vTemp.count();buffer = vTemp.data();buffer_xml = buffer+12;char buff[cnt];for(int i=0;i<cnt;i++){
buff[i] = *(buffer_xml+i);}
//上面的操作是从收到的数据中解析需要的内容,去掉12个字节头,有些繁琐,但是可以运行,数据保存在buffer_xml中
vTemp = QByteArray(buff);rec_xml.write(vTemp);
}
}至此,一个简单的tcp通信就完成了。