QTcp [服务器和套接字]:无法读取文件发送

时间:2012-09-29 08:30:51

标签: qt4.7 qtcpserver

早上好,我正在寻找一个关于使用QTcpSocket将文件从一台PC发送到另一台PC的示例。我试着创建自己的代码。我有一个应用程序,用户将从他的DD(所有类型)中选择一个文件并将其发送到TcpServer,然后该服务器将此文件发送给其他客户端。但是,我有一个问题,当我选择文件和我发送它,在客户端,我有这样的消息:文件正在发送,但在服务器端,它告诉我文件没有收到它的完全字节。 有任何建议请。这是在客户端发送文件的功能:

void FenClient::on_boutonEnvoyer_2_clicked()
{
    QString nomFichier = lineEdit->text();
        QFile file(lineEdit->text());
        if(!file.open(QIODevice::ReadOnly))
        {
            qDebug() << "Error, file can't be opened successfully !";
            return;

        }

        QByteArray bytes = file.readAll();

        QByteArray block;
        QDataStream out(&block, QIODevice::WriteOnly);

        out << quint32(0);
        out << nomFichier;
        out << bytes;
        out.device()->seek(0);
        out << quint32((block.size() - sizeof(quint32)));

        qDebug() << "Etat : envoi en cours...";
         listeMessages->append("status : sending the file...");

        socket->write(block);
}

和服务器端:

void FenServeur::datarecieved()
{

    QTcpSocket *socket = qobject_cast<QTcpSocket *>(sender());

        if(socket == 0)
        {
            qDebug() << "no Socket!";
            return;
        }

        forever
        {
            QDataStream in(socket);
            if(blockSize == 0)
            {
                if(socket->bytesAvailable()  )
                {
                    qDebug() << "Error < sizeof(quint32))";
                    return;
                }

                in >> blockSize;
            }

            if(socket->bytesAvailable() < blockSize)
             {
                qDebug() << "data not recieved with its total bytes";

                return;
             }

            qDebug() << "!!!!!!";
            QByteArray dataOut;
            QString nameFile;
            in >> nameFile >> dataOut;
            QFile fileOut(nameFile);
            fileOut.open(QIODevice::WriteOnly);
            fileOut.write(dataOut);
            fileOut.close();

            blockSize = 0;
         }
}

void FenServeur::sendToAll(const QString &message)
{

    QByteArray paquet;
    QDataStream out(&paquet, QIODevice::WriteOnly);

    out << (quint32) 0;
    out << message;
    out.device()->seek(0);
    out << (quint32) (paquet.size() - sizeof(quint32));
    for (int i = 0; i < clients.size(); i++)
    {
        clients[i]->write(paquet);
    }

}

所以我无法将服务器收到的文件写入新文件。 有任何建议请!!并提前感谢

1 个答案:

答案 0 :(得分:0)

你的代码正在等待另一方,但另一方正在等你。任何允许双方互相等待的协议都会从根本上被打破。

TCP允许发送方等待接收方,但不允许接收方等待发送方。这是有道理的,因为不允许发送者等待接收器需要无限量的缓冲。因此,对于分层在TCP之上的任何应用程序,接收方可能不会等待发送方。

但你这样做:

        if(socket->bytesAvailable() < blockSize)
        {
            qDebug() << "data not recieved with its total bytes";

            return;
        }

在这里,您正在等待发送方在您愿意接收(从套接字中提取数据)之前取得进展(bytesAvailable要增加)。但是发件人在愿意发送更多数据之前等待您取得进展。这会导致死锁。不要这样做。

尽可能地尽可能多地接收尽可能多的数据。 从不坚持通过网络接收更多数据,然后才能从网络堆栈中提取已接收的数据。