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()
将是>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类中的ReadyRead()信号没有被触发
Python QtNetwork.QTcpSocket.readAll() 和 QtNetwork.QTcpSocket.write() 不起作用
同一对象中的 QTcpSocket 到 QTcpSocket
Qt - 当一个类中有多个 QTcpSocket 时,我如何知道哪个 QTcpSocket 发出了 readyRead 信号?