QTcpSocket bytesAvailable()= 0
此插槽必须将消息放入套接字的缓冲区,但不发送readyRead()信号。 我发现写入数据的大小与数组大小相同,但方法bytesAvailable()总是返回零。 不能明白为什么会发生QTcpSocket bytesAvailable()= 0
代码:
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("");
}当新的数据准备好读
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...
}
我添加了你写的代码,并且套接字仍然不发出readyRead() –
我忘了提及,readyRead信号可能不会被发射如果你打电话它来自您的插槽方法之一。把它放在外面的某个地方。 – bkausbk
我只是不明白为什么信号没有被证实,如果我写入数据到插座 –
你看过了Qt插座的例子吗?它看起来有点奇怪,你想用该代码做什么?通常你写入一个套接字,并且接收者(即一个套接字服务器)可能会发回一些东西,然后你可以读取数据,并有一些字节可用,而'bytesAvailable()'将会是'> 0'。 – xander
我想写数据到一个套接字,并在我的客户端和我的服务器读取这些数据 –