刚接触QT的socket通信,在网上查的资料都没具体的说明其中的机制,导致在开发的过程中,误以为和C++的socket通信机制差不多,找了好久才解决的问题。
在网上的大多数资料都只是在简单情况下的通信,而我发现QT的socket通信机制是这样的,当从服务端或客户端第一次收到readyRead信号,然后读取包体没有读完的时候,readyRead信号会再次触发,然后再次进入槽函数。
connect(mopTcpSocket, &QTcpSocket::readyRead, this, &ClientNetObject::mvslotsRecvMessages);
void ClientNetObject::mvslotsRecvMessages()
{
if () // 首先读取头信息
{
int recv_len = mopTcpSocket->bytesAvailable();
if () // 不能小于头字节数
{
return; // 如果没有读完的话,还会再次进入槽函数
}
else
{
// 读取头信息并标注头信息已经被读取
mbIsTcpRecvHeadOk = true;
}
}
//else // 读取包体
{
tcpRecvBlock.append(mopTcpSocket->readAll());
if (tcpRecvBlock.size() > mopPackage->BodyLength + 1)
{
//粘包问题
QByteArray save_data;
QByteArray ba("}");
int length = 0;
length = tcpRecvBlock.indexOf(ba, 0);
save_data = tcpRecvBlock.left(length + 1);
tcpRecvBlock.clear();
tcpRecvBlock = save_data;
}
// 当tcpRecvBlock的大小和实际大小相等时认为读取完毕
if (tcpRecvBlock.size() == mopPackage->BodyLength + 1)
{
..........
.....
// 重新复位
mvReset();
}
else
{ // 未读取完
qDebug() << "******************************************Read not completed*******************";
return; // 如果没有读完的话,还会再次进入槽函数
}
}
}