此插槽必须将消息放入套接字的缓冲区,但不发送信号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("");
}
答案 0 :(得分: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...
}