QTcpSocket bytesAvailable()= 0

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(""); 

}当新的数据准备好读

+0

你看过了Qt插座的例子吗?它看起来有点奇怪,你想用该代码做什么?通常你写入一个套接字,并且接收者(即一个套接字服务器)可能会发回一些东西,然后你可以读取数据,并有一些字节可用,而'bytesAvailable()'将会是'> 0'。 – xander

+0

我想写数据到一个套接字,并在我的客户端和我的服务器读取这些数据 –

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... 
} 
+0

我添加了你写的代码,并且套接字仍然不发出readyRead() –

+0

我忘了提及,readyRead信号可能不会被发射如果你打电话它来自您的插槽方法之一。把它放在外面的某个地方。 – bkausbk

+0

我只是不明白为什么信号没有被证实,如果我写入数据到插座 –