QTcpSocket bytesAvailable() = 0

Posted

技术标签:

【中文标题】QTcpSocket bytesAvailable() = 0【英文标题】: 【发布时间】:2017-10-20 09:59:03 【问题描述】:

此槽必须将消息放入套接字的缓冲区,但未发送信号 readyRead()。 我发现写入数据的大小与数组大小相同,但方法 bytesAvailable() 总是返回零。 不明白为什么会这样

代码:

void Client::slotMessageSend()

  QByteArray array;
  QDataStream str(&array, QIODevice::WriteOnly);
  str.setVersion(QDataStream::Qt_4_5);
  str << quint16(0) << QTime::currentTime() << ui->textMessage->toPlainText() ;

  str.device()->seek(0);
  str << quint16(array.size() - sizeof(quint16));
  cout << pClientSocket->write(array) << endl;
  cout << array.size()<< "   " << pClientSocket->bytesAvailable() << endl;

  ui->textMessage->setPlainText("");

【问题讨论】:

你看过 Qt 套接字示例吗?看起来有点奇怪,你想用那个代码做什么?通常你写一个套接字,接收器(即套接字服务器)可能会发回一些东西,然后你可以读取数据并有一些可用的字节,bytesAvailable() 将是&gt;0 我想将数据写入套接字并在我的客户端和服务器上读取这些数据 【参考方案1】:

QTcpSocket::readyRead 将在新数据准备好读取时发出。在这种情况下,QTcpSocket::bytesAvailable 返回可用数据的大小。如果没有数据发送到该套接字,它将始终返回 0。

调用该函数大多只在对readyRead 信号作出反应的槽中才有意义。

如果您的意图是读取在写入套接字后发回的数据 - 因为客户端总是响应写入 - 可能是还没有数据可用,或者另一端从未发回任何数据。

您可以尝试以下操作:

pClientSocket->write(...)
if (pClientSocket->waitForReadyRead(...)) 
    // yes there is data available
    // pClientSocket->bytesAvailable() > 0

示例如何更好地做到这一点:

Client::Client() 
    connect(pClientSocket, &QTcpSocket::readyRead, this, &Client::HandleRead);
    connect(pClientSocket, &QTcpSocket::bytesWritten, this, &Client::HandleWrite);


Client::SendSomeData(const QByteArray& Data) 
    pClientSocket->write(Data);


Client::HandleWrite(qint64 Size) 
    // Size bytes are written to socket buffer...


Client::HandleRead() 
    // pClientSocket->bytesAvailable() are available in socket buffer...

【讨论】:

我添加了你写的代码,但 socket 仍然没有发出 readyRead() 我忘了说,如果您从您的插槽方法之一调用它,可能不会发出 readyRead 信号。放在外面的某个地方。 我只是不明白为什么我将数据写入套接字时没有发出信号 @VityaMiroshnychenko:查看我的更新答案。由于您作为 pClientSocket 正在向服务器发送数据,服务器是否响应发送任何数据?可能是服务器没有发回任何东西? 对于当前阶段的服务器不发回任何东西。只有当我从服务器接收到东西时才从客户端套接字发送 readyRead 吗?

以上是关于QTcpSocket bytesAvailable() = 0的主要内容,如果未能解决你的问题,请参考以下文章

没有信号/插槽的 QtcpSocket

QTcpSocket类中的ReadyRead()信号没有被触发

QT攻略——我在QT中遇到的那些坑

Python QtNetwork.QTcpSocket.readAll() 和 QtNetwork.QTcpSocket.write() 不起作用

同一对象中的 QTcpSocket 到 QTcpSocket

Qt - 当一个类中有多个 QTcpSocket 时,我如何知道哪个 QTcpSocket 发出了 readyRead 信号?