2012-09-29 62 views
1

早上好,我正在寻找一个关于用QTcpSocket从一台电脑发送文件到另一台电脑的例子。我试图创建自己的代码。我有一个应用程序,其中,用户将从他的DD(所有类型)中选择一个文件并将其发送到TcpServer,然后该服务器将此文件发送给其他客户端。但是,我遇到问题,当我选择该文件,我发送它,在客户端,我有这样的信息:文件正在发送,但在服务器端,它表明,该文件没有收到它的totaly字节。 请任何建议。这是在客户端的端发送的文件中的函数:QTcp [服务器和套接字]:无法读取文件发送

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); 
    } 

} 

所以我不能写服务器收到到一个新的文件的文件。 请任何建议!并提前致谢

回答

0

您的代码正在等待另一方,但另一方正在等待你。任何允许双方等待对方的协议基本上已经被打破。

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

但你这样做:

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

      return; 
     } 

在这里,你正在等待发送者取得进展(bytesAvailable以增加),你愿意接受(从插槽中拔出数据)前。但发件人正在等待您在愿意发送更多数据之前取得进展。这会导致死锁。不要这样做。

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

+0

感谢您的回复。你的意思是我必须从我的代码中删除这部分!但是当我这样做,我的服务器应用程序崩溃,也没有收到数据 – tasnim

+0

@tasnim:是的,这是第一步。它是有道理的,一旦你修复一个bug,一个新的bug显示它的脸。你必须继续下去,直到你修复了所有的错误。 –

+0

如何写我的文件只是在客户端。我的意思是,当我从客户端接收文件时,服务器将直接发送给其他客户端,这将写入文件,可能是问题是在写入文件中的服务器端!!这将解决我的问题! – tasnim