使用qdatastream读取和写入qtcpsocket

时间:2017-02-07 06:17:20

标签: qt sockets network-programming qtcpsocket

QTcpSocket使用QDatastreamhere进行阅读和书写有各种方法{{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);

非常感谢帮助!

0 个答案:

没有答案