小編在使用qt進行tcp傳輸時候靡挥,接收端遇到接收粘包問題◇仙現(xiàn)在將解決思路描述如下焦影。
1先朦、發(fā)送數(shù)據(jù)格式
一幀數(shù)據(jù)以竣贪!開頭以盛撑?結(jié)尾杜漠,幀數(shù)據(jù)間以+區(qū)分
例如:腰湾!12#21#32#23#50埃篓?+
2处坪、接收端處理
判斷接收數(shù)據(jù)是否以+結(jié)尾,如果是那么就以+切分架专,然后處理每一幀數(shù)據(jù)同窘,如果不是那么就將接收字符串緩存拼接起來。
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){
//數(shù)據(jù)解析
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想邦、缺點
由于使用了緩存,那么實時性大大折扣委刘。