QT中TCP传输结构体
时间: 2023-07-21 17:33:03 浏览: 260
在 QT 中,可以使用 `QTcpSocket` 类进行 TCP 传输,而将结构体传输则可以使用 `QDataStream` 类进行序列化和反序列化。
以下是一个简单的示例代码,其中 `MyStruct` 是需要传输的结构体:
```c++
struct MyStruct {
int a;
double b;
};
MyStruct myStruct = {1, 2.0};
// 创建 QTcpSocket 对象并连接服务器
QTcpSocket* socket = new QTcpSocket(this);
socket->connectToHost("127.0.0.1", 1234);
if (socket->waitForConnected()) {
// 创建一个 QByteArray 对象
QByteArray block;
// 创建一个 QDataStream 对象,将其绑定到 QByteArray 对象上
QDataStream out(&block, QIODevice::WriteOnly);
// 设置数据流的版本号
out.setVersion(QDataStream::Qt_5_15);
// 将结构体序列化并写入数据流中
out << myStruct;
// 将数据流中的数据发送给服务器
socket->write(block);
}
```
在服务器端接收数据时,可以使用类似的方式进行反序列化:
```c++
QTcpSocket* clientConnection = qobject_cast<QTcpSocket*>(sender());
if (clientConnection) {
// 读取从客户端发送过来的数据
QByteArray data = clientConnection->readAll();
// 创建一个 QDataStream 对象,将其绑定到 QByteArray 对象上
QDataStream in(&data, QIODevice::ReadOnly);
// 设置数据流的版本号
in.setVersion(QDataStream::Qt_5_15);
// 读取数据流中的数据并反序列化为结构体
MyStruct myStruct;
in >> myStruct;
// 处理接收到的结构体数据
qDebug() << "Received struct: " << myStruct.a << myStruct.b;
}
```
在上述代码中,`out << myStruct` 将 `MyStruct` 序列化为二进制格式,并将其写入到 `QByteArray` 中。而 `in >> myStruct` 则从 `QByteArray` 中读取二进制数据,并将其反序列化为 `MyStruct` 对象。注意,在进行序列化和反序列化时,需要使用相同的数据流版本号。
阅读全文