请问我下面的代码对吗?能实现对数据的拆包和并包吗?
如果不能哪里出了问题麻烦大神给我指出来下
void SocketWidget::onSocketReadyRead()
{
if(tcpSocket->bytesAvailable() <= 0)
{
return;
}
qint64 totalBytes = 0;
m_buffer = NULL;
//从缓存区去除数据,但是不确定取出来的字节数;
QByteArray buffer= tcpSocket->readAll();
m_buffer.append(buffer);
unsigned int totalLen = m_buffer.size();
textEditRead->append(buffer);
//这边确实需要利用长度做while循环,因为有可能一下子读取到两条以上的完整记录,就需要进行循环处理了;
//超过一条完整小于第二条完整记录时,如果已经达到包头长度就先把包头保存下来,整个过程循环往复
while (totalLen)
{
//与QDataStream绑定,方便操作
QDataStream packet(m_buffer);
packet.setVersion(QDataStream::Qt_5_10);
//不够包头长度的不处理,结束while循环
unsigned int MINSIZE = sizeof(qint64)*2;
if(totalLen < MINSIZE)
{
//textEditRead->append(buffer);
break;
}
//将包头读入了进来按照定义的协议,先读命令长度,再读命令的类型;
packet >> totalBytes >>serverCmd;
//缓存中的内容长度没有达到命令的长度,那就先结束,等足够了再来解析
if(totalLen<totalBytes)
break;
//足够长了就开始解析
// QDir dir(sysFilePath); //系统文件目录
// if(!dir.exists())
// dir.mkdir(sysFilePath);
switch (serverCmd)
{
case QString_recv:
{
qDebug()<<"开始接收字符串...";
QByteArray datas = m_buffer.mid(MINSIZE,totalBytes-MINSIZE);
QString strInfo;//数据包中的message
strInfo.prepend(datas);
qDebug() <<strInfo;//输出接收到的QString
}
break;
default:
//qint64 nbytes = tcpSocket->bytesAvailable();
//textEditRead->append(buffer);
break;
}
//缓存多余的数据
buffer = m_buffer.right(totalLen - totalBytes); //截取下一个数据包的数据,留作下次读取
totalLen = buffer.size();
//更新多余的数据
m_buffer = buffer;
}
/* while (tcpSocket->bytesAvailable() > 0)
{
qint64 nbytes = tcpSocket->bytesAvailable();
QByteArray array = tcpSocket->read(nbytes);
textEditRead->append(array);
}*/
}