• 4997阅读
  • 5回复

为什么大于10KB的文件就收不到 [复制链接]

上一主题 下一主题
离线weilong122
 

只看楼主 倒序阅读 楼主  发表于: 2006-05-26
谁帮忙看一下,当我发送的文件小于10KB的时候,文件在接收端可以正常接受,当大于10KB的时候,就只能收到一部分(一般只有5KB)

发送端
  1. void Sender::ConnectTo()
  2. {
  3.   tcpSocket = new QTcpSocket(this);
  4.  
  5.   tcpSocket->connectToHost(Ipedit->text(),5002);
  6.  
  7.   connect(tcpSocket, SIGNAL(connected ()), this, SLOT(SendFile()));
  8.  
  9. }


  1. void Sender::SendFile()
  2. {
  3.   int bytesWrite = 0;
  4.                                      
  5.   fileName = QFileDialog::getOpenFileName(this,tr("Open File"), QDir::currentPath());
  6.  
  7.   QFile Sendfile(fileName);
  8.   Sendfile.open(QIODevice::ReadOnly);  
  9.  
  10.   QDataStream stream( tcpSocket );
  11.  
  12.   QFileInfo f(fileName);
  13.   fileName = f.fileName();
  14.   int filesize =f.size();
  15.  
  16.   stream << filesize;
  17.   stream << fileName;
  18.  
  19.   while(!Sendfile.atEnd())
  20.   {
  21.       if(bytesWrite + 2048 <= filesize)
  22.       {
  23.             char buf[2048];
  24.             Sendfile.read(buf, 2048);
  25.             stream.writeRawData(buf,2048);
  26.             bytesWrite += 2048;
  27.            
  28.       }
  29.       else{
  30.             int blocksize = filesize - bytesWrite;
  31.             char buf[blocksize];
  32.             Sendfile.read(buf, blocksize);
  33.             stream.writeRawData(buf,blocksize);
  34.            
  35.           }
  36.        
  37.   }
  38.  
  39.   Sendfile.close();
  40. }  




接收端
  1. void Sender::AcceptConnection()
  2. {
  3.   clientConnection = tcpServer->nextPendingConnection();
  4.   connect(clientConnection, SIGNAL(readyRead()),this,SLOT(ReceiveFile()));
  5. }



  1. void Sender::ReceiveFile()
  2. {
  3.   int filesize = 0;
  4.   int readsize = 0;
  5.   QDataStream in(clientConnection);
  6.  
  7.   in >> filesize;
  8.   in >> fileName;
  9.    
  10.   QFile file(fileName);
  11.   if (!file.open(QFile::WriteOnly | QFile::Append))
  12.   {
  13.     QMessageBox::warning(this,"error","can not open the file!");
  14.     return;  
  15.   }
  16.                                      
  17.        
  18.   while (1)
  19.   {
  20.     if( clientConnection->isReadable())
  21.     {
  22.       int receivesize = clientConnection->bytesAvailable();
  23.       buf = new char[receivesize];
  24.       clientConnection->read(buf, receivesize);
  25.       file.write(buf, receivesize);
  26.       readsize += receivesize;
  27.       delete []buf;
  28.       if(readsize == filesize) break;
  29.     }
  30.                    
  31.   }//while
  32.     file.close();
  33.                        
  34. }
[ 此贴被weilong122在2006-05-27 10:21重新编辑 ]
离线weilong122

只看该作者 1楼 发表于: 2006-05-27
我把接收端改成下面的样子,但是这回是重复得接收到开始的一端数据
知道的帮帮忙啊

  1. void Sender::ReceiveFile()
  2. {
  3.   int filesize = 0;
  4.   int readsize = 0;
  5.   QDataStream in(clientConnection);
  6.  
  7.   in >> filesize;
  8.   in >> fileName;
  9.    
  10.   QFile file(fileName);
  11.  
  12.   if (!file.open(QFile::WriteOnly | QFile::Append))
  13.   {
  14.     QMessageBox::warning(this,"error","can not open the file!");
  15.     return;  
  16.   }
  17.                                      
  18.        
  19.   while (1)
  20.   {
  21.     if( clientConnection->isReadable())
  22.     {
  23.       if(readsize + 2048 <= filesize)
  24.       {
  25.         buf = new char[2048];
  26.         clientConnection->read(buf, 2048);    
  27.         file.write(buf, 2048);    
  28.         readsize += 2048;
  29.         delete []buf;
  30.         if(readsize == filesize) break;
  31.       }
  32.       else
  33.       {
  34.         int blocksize = filesize - readsize;
  35.         buf = new char[blocksize];
  36.         clientConnection->read(buf, blocksize);    
  37.         file.write(buf, blocksize);    
  38.         readsize += blocksize;
  39.         delete []buf;    
  40.         if(readsize == filesize) break;
  41.       }
  42.    
  43.     }
  44.          
  45.   }
  46.     file.close();
  47.     clientConnection->disconnect();
  48.                  
  49. }
离线weilong122

只看该作者 2楼 发表于: 2006-05-30
怎么好象全国人民都没几个熟悉Qt 的
离线xuxinshao

只看该作者 3楼 发表于: 2006-09-22
熟悉Qt的全国人民就不多
离线style
只看该作者 4楼 发表于: 2006-09-23
见楼下
[ 此贴被style在2006-09-25 01:56重新编辑 ]
离线style
只看该作者 5楼 发表于: 2006-09-23
回头一想你程序不只这个问题...

还有一重要问题是
void Sender::ReceiveFile()
这是个局部函数,即每次接收数据完后就会关闭...
你下次接收数据时又会创建文件file,还好你是以追加,可是中间有几个别的变量就不能放在函数中.而要放到类数据成员中,防止函数结束,栈区释放.
比如filesize,你如果是选择只发送一次文件大小,就像我楼上帮你改的方法1一样,那样的话, 从第二次调用filesize都为0了..因为只赋了初值为0..
好好想想这问题吧...把有些变量放到类数据成员中去
快速回复
限100 字节
 
上一个 下一个