QTcpSocket使用QDatastream来here进行阅读和书写有各种方法{{3}}
不同之处在于,我将发送超过"一个数据包"或块。
服务器(发送)端和客户端(接收)的基本实现如下所示 - 仅显示实际的发送和接收片段
更多信息,我尝试了什么:
写入QTcpSocket时,我尝试使用QTcpSocket::canReadLine()
但是在QTcpSocket::waitForReadReady()
信号触发后,这会立即失败。
然后我在while循环中尝试QDataStream::atEnd()
导致系统崩溃:(
下面的代码显示了我最近尝试通过QDataStream文档,并使用commitTransaction来说明
如果没有收到完整数据包,此代码会将流恢复到初始位置,之后您需要等待更多数据到达。
标题Using Read Transactions
下。但是当然,这只是读取了一个发送的块,即第一个块。
问题:
多次写入QTcpSocket
时,每次刷新套接字以发送该数据时,如何从发送时QTcpSocket
读取此信息,保留原始信息。发送结构"?
以下示例仅读取第一个块并结束。我想阅读包含"响应2"和#34;回应3"。
代码实施:
// server.h
//...
QTcpSocket *clientSocket = nullptr;
QDataStream in;
//...
// server.cpp
//...
in.setDevice(clientSocket);
in.setVersion(QDataStream::Qt_4_0);
in.startTransaction();
QString nextFortune;
in >> nextFortune;
if (in.commitTransaction())
ui->lblOut->setText(nextFortune);
if (clientSocket != nullptr) {
if (!clientSocket->isValid()) {
qDebug() << "tcp socket invalid";
return;
}
if (!clientSocket->isOpen()) {
qDebug() << "tcp socket not open";
return;
}
QByteArray block;
QDataStream out(&block, QIODevice::WriteOnly);
out.setVersion(QDataStream::Qt_4_0);
out << QString(QString("Response:") + nextFortune);
if (!clientSocket->write(block)){
QMessageBox::information(this, tr("Server"),tr("Could not send message"));
}
clientSocket->flush();
// block.clear();
out << QString("Response number 2");
if (!clientSocket->write(block)){
QMessageBox::information(this, tr("Server"),tr("Could not send message"));
}
clientSocket->flush();
// block.clear();
out << QString("Response number 3 here, and this is the end!");
if (!clientSocket->write(block)){
QMessageBox::information(this, tr("Server"),tr("Could not send message"));
}
clientSocket->flush();
clientSocket->disconnectFromHost();
}
//...
和客户端
// client.h
//...
QTcpSocket *tcp_con = nullptr;
QDataStream in;
//...
// client.cpp
//...
if(!tcp_con->waitForReadyRead()){
qDebug(log_lib_netman_err) << "tcp con timeout for reading";
tcp_con->disconnectFromHost();
return ReturnObject(ReturnCode::SocketError, QString());
}
in.setDevice(tcp_con);
in.setVersion(QDataStream::Qt_4_0);
in.startTransaction();
QList<QString> data_rcv = QList<QString>();
QString s;
// while (tcp_con->canReadLine()) {
// in >> s;
// data_rcv.push_back(s);
// }
// while (!in.read) {
in >> s;
data_rcv.push_back(s);
// }
while (!in.commitTransaction()){
qDebug(log_lib_netman_info) << "waiting for more data";
in >> s;
data_rcv.push_back(s);
// qDebug(log_lib_netman_err) << "Unable to send data to server";
// tcp_con->disconnectFromHost();
// return ReturnObject(ReturnCode::FailedReceiving, QString());
}
// if (s.isEmpty()) {
// qDebug(log_lib_netman_err) << "Empty response recieved";
// tcp_con->disconnectFromHost();
// return ReturnObject(ReturnCode::NoDataRecieved, QString());
// }
tcp_con->disconnectFromHost();
return ReturnObject(ReturnCode::ReceivedSuccess, data_rcv);
非常感谢帮助!