qt tcp粘包处理办法

小编在使用qt进行tcp传输时候,接收端遇到接收粘包问题。现在将解决思路描述如下。
1、发送数据格式
一帧数据以!开头以?结尾,帧数据间以+区分
例如:!12#21#32#23#50?+
2、接收端处理
判断接收数据是否以+结尾,如果是那么就以+切分,然后处理每一帧数据,如果不是那么就将接收字符串缓存拼接起来。
QByteArray array=tcpsocket->readAll();
QString data(array);
static QString data1="";
data1+=data;
if(data1.endsWith("+")){
QStringList listdata=data1.split("+");
// +分割
//判断处理每一个
if(listdata.length()>0){
for(int i=0;i<listdata.length();i++){
QString dataN=listdata.at(i);
if(dataN.length()>0){
//数据解析
if(dataN.startsWith("!"))
{
dataN=dataN.left(dataN.length()-1);//取出首字母
dataN=dataN.right(dataN.length()-1);//去除最后一个字母
QStringList list=dataN.split("#");
QString dtime=QDateTime::currentDateTime().toString("yyyy.MM.dd/hh/mm/ss");
int rows=ui->tableWidget->rowCount();
ui->tableWidget->setRowCount(rows+1);
ui->tableWidget->setItem(rows,0,new QTableWidgetItem(dtime));
for (int i=0;i<list.length();i++){
ui->tableWidget->setItem(rows,i+1,new QTableWidgetItem(list.at(i)));
}

}
}
}
data1="";
}
3、缺点
由于使用了缓存,那么实时性大大折扣。

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。