tcp通信是qt开发中常用的通信方式,这里把项目中使用的过程记录一下备忘。
1.首先在.h文件中引用头文件
#include同样在头文件中定义一个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{
buff[i] = *(buffer_xml+i);}
//上面的操作是从收到的数据中解析需要的内容,去掉12个字节头,有些繁琐,但是可以运行,数据保存在buffer_xml中
vTemp = QByteArray(buff);rec_xml.write(vTemp);
}
}至此,一个简单的tcp通信就完成了。