【问题标题】:QTcpSocket bytesAvailable() = 0QTcpSocket 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
  • 我想将数据写入套接字并在我的客户端和服务器上读取这些数据

标签: qt sockets


【解决方案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 吗?
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-12-31
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-11-15
相关资源
最近更新 更多