如何在QTcpSocket中读取完整数据?

 王立君淑霖_189 发布于 2023-02-13 19:05

现在服务器(用java实现)会向我发送一些流数据,我的代码如下:

connect(socket, SIGNAL(readyRead()), this, SLOT(read_from_server()));

read_from_server():

{
    while (socket->bytesAvailable())
    {
        QString temp = socket->readAll();
    }
}

但我发现即使服务器发给我一个只有几个字符的字符串,数据被截断,我的函数被调用两次,因此temp是我想要的永不完整的数据.
如果服务器发给我一个更长的字符串,我的函数可能会被调用三次或更多次,这使得我很难知道数据完全被传输的时间.
所以任何人都可以告诉我如何轻松完全接收数据,没有这么多困扰的步骤?如果这与其他一些问题重复,我很抱歉,我无法让他们的答案适合我.非常感谢!

1 个回答
  • 您所看到的是客户端 - 服务器通信的正常现象.数据以数据包形式发送,readyRead信号通知您的程序有可用的数据,但没有关于数据的数据或数据的概念,因此您必须处理此问题.

    要正确读取数据,您需要一个缓冲区,如@ratchetfreak所述,在从流中读取字节时附加字节.了解所发送数据的格式非常重要,以便知道何时有完整的消息.我之前使用过至少两种方法来做到这一点: -

    1)确保发送的消息以正在发送的消息的大小(以字节为单位)开头.在接收数据时,首先要读取大小并继续附加到缓冲区,直到它达到预期的大小.

    2)以已知格式发送所有数据,例如JSON或XML,可以检查消息的结尾.例如,在JSON的情况下,所有数据包将以一个左括号'{'开头,以一个右括号'}'结束,因此您可以计算大括号并匹配数据,或使用QJsonDocument :: fromRawData来验证数据完整.

    使用这两种方法后,我建议使用第一种方法; 包括正在发送的消息的大小.

    2023-02-13 19:10 回答
撰写答案
今天,你开发时遇到什么问题呢?
立即提问
热门标签
PHP1.CN | 中国最专业的PHP中文社区 | PNG素材下载 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有