QT的socket通信机制

刚接触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; // 如果没有读完的话,还会再次进入槽函数
        }
    }
}


版权声明:本文为Dein_Vater原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。