QSocket和QDataStream通信
1.需求
两个进程的通信,但是通信的过程的数据量大并且含有复杂的结构体(包含4层)。
2.过程
方法一:直接通过拆分构体,多次发送数据,在接收端接收数据组合结构体。因为多次发送无法保证接收的先后性,导致下一步的结构体拼接受到影响。(放弃)
方法二:通过QIODevice绑定一个socket,在接收端直接拿数据。可以使用,但是当发送数据量大时候,提前相应接收数据。(放弃)
方法三:还是通过流来传输,只不过是将复杂的结构体拆分为简单类型存入流,流再写入QByetArray中发送,然后接收到后按同样的方式读取。(可行)
3.结论
不多BB,代码思路如下。
//结构体:
打工人
{
QString Name;
QList<QString> Deposit_Banks;
};
人上人
{
QString Name;
QVector<打工人> Workers;
};
//发送端:
sendPoint{
人上人 真人上人;
QByteArray byts;
QDataStream stream(&byts, QIODevice::WriteOnly);
stream << (quint32)0x22;//头的标志
stream << 真人上人.Name
<< 真人上人.Workers.size();
for (int i = 0; i < 真人上人.Workers.size().i++)
{
打工人 worker = 真人上人.Workers.at(i);
stream << worker.Name
<< worker.Deposit_Banks.size();
for (int k = 0; k < worker.Deposit_Banks.at(i); k++)
{
stream << k < worker.Deposit_Banks.at(i).at(k);
}
}
Socket.write(byts);
}
//接收端:
receivePoint{
QByteArray byts = Socket->readAll();
QDataStream stream(&byts, QIODevice::ReadOnly);
int head;
stream >> head;
if (head == 0x22)
{
人上人 真人上人;
stream >> 真人上人.Name;
int count;
stream >> count;
for (int i = 0; i < count; i++)
{
打工人 Worker;
stream >> Worker.Name;
int banks;
stream >> banks;
for (int k = 0; k < banks; k++)
{
QString bankName;
stream >> bankName;
Worker.Deposit_Banks.push_back(bankName);
}
真人上人.Workers.push_back(Worker);
}
}
}
4.注意
主要发送端和接收端流的类型的一致性,什么类型打包,什么类型解包。
当前版本 Qt4和vs开发。