你是一只小猪仔 2020-03-24 22:56 采纳率: 33.3%
浏览 184

Qt TCP client有些地方不理解

不明白的是in >> blockSize是单纯只降int型的数据赋值给blockSize吗?
blockSize的定义是quint16。
请问下 in >> 是否可以自动匹配类型的?
请问下 这是关于哪方便的知识点,我自己去恶补一下

Client:

QDataStream in(tcpSocket);
// 设置数据流版本,这里要和服务器端相同
in.setVersion(QDataStream::Qt_4_0);

// 如果是刚开始接收数据
if (blockSize == 0) {
    //判断接收的数据是否大于两字节,也就是文件的大小信息所占的空间
    //如果是则保存到blockSize变量中,否则直接返回,继续接收数据
    if(tcpSocket->bytesAvailable() < (int)sizeof(quint16)) return;
    in >> blockSize;
}
// 如果没有得到全部的数据,则返回,继续接收数据
if(tcpSocket->bytesAvailable() < blockSize) return;
// 将接收到的数据存放到变量中
in >> message;
// 显示接收到的数据
ui->messageLabel->setText(message);

Server:

// 用于暂存要发送的数据
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
// 设置数据流的版本,客户端和服务器端使用的版本要相同
out.setVersion(QDataStream::Qt_4_0);
out << (quint16)0;
out << tr("hello TCP!!!");
out.device()->seek(0);
out << (quint16)(block.size() - sizeof(quint16));

// 获取已经建立的连接的套接字
QTcpSocket *clientConnection = tcpServer->nextPendingConnection();
connect(clientConnection, &QTcpSocket::disconnected,
        clientConnection, &QTcpSocket::deleteLater);
clientConnection->write(block);
clientConnection->disconnectFromHost();

// 发送数据成功后,显示提示
ui->label->setText(tr("发送数据成功!!!"));
  • 写回答

2条回答 默认 最新

  • 世当珍惜 2020-03-25 09:41
    关注

    可以了解一下C++的流运算符,看下QT这个QDataSteam的流运算符实现就知道它的机制了

    评论

报告相同问题?

悬赏问题

  • ¥15 关于#windows#的问题:怎么用WIN 11系统的电脑 克隆WIN NT3.51-4.0系统的硬盘
  • ¥15 matlab有关常微分方程的问题求解决
  • ¥15 perl MISA分析p3_in脚本出错
  • ¥15 k8s部署jupyterlab,jupyterlab保存不了文件
  • ¥15 ubuntu虚拟机打包apk错误
  • ¥199 rust编程架构设计的方案 有偿
  • ¥15 回答4f系统的像差计算
  • ¥15 java如何提取出pdf里的文字?
  • ¥100 求三轴之间相互配合画圆以及直线的算法
  • ¥100 c语言,请帮蒟蒻写一个题的范例作参考