• 12833阅读
  • 11回复

请教TCP文件传输问题 [复制链接]

上一主题 下一主题
离线x000zhiwei
 
只看楼主 倒序阅读 楼主  发表于: 2010-05-04
— 本帖被 XChinux 从 General Qt Programming 移动到本区(2011-01-02) —
大家好!
小弟遇到一点问题,想请教各位高手!
我用QT 写了一个TCP文件传输程序,服务器端接收JPG文件时,接收到的比发送的要小,接收到的图片显示的时候,底部有一个黑色长条,其他部分显示没问题;传输文本文件的时候,接收到的是空文件。
请高手指教!小弟先谢谢了!
离线x000zhiwei
只看该作者 1楼 发表于: 2010-05-04
补充一下:
控制台显示如下提示:
corrupt JPEG data: premature end of data segment
离线dbzhang800

只看该作者 2楼 发表于: 2010-05-04
贴出你发送和接收的代码
离线x000zhiwei
只看该作者 3楼 发表于: 2010-05-06
我的发送文件数据格式为:
总长度 文件名长度    文件名               文件数据
64位    64位     由文件名长度决定
发送端:
void Dialog::updateClientProgress(qint64 numBytes)
{
    bytesWritten += (int)numBytes;
    if (bytesToWrite > 0){
        outBlock = localFile->read(qMin(bytesToWrite, loadSize));
     bytesToWrite -= (int)tcpClient.write(outBlock);
    outBlock.resize(0);    
    }
    else{  
        localFile->close();
    }
    
}

接受端:
void Dialog::updateServerProgress()
{
         if(bytesReceived <= sizeof(qint64)*2){
        if((tcpServerConnection->bytesAvailable() >= sizeof(qint64)*2)&&(fileNameSize ==0)){
          in>>TotalBytes>>fileNameSize;
    bytesReceived += sizeof(qint64)*2;
       }      
      if((tcpServerConnection->bytesAvailable() >= fileNameSize)&&(fileNameSize !=0)){
       in>>fileName;
       bytesReceived += fileNameSize;
       localFile = new QFile(fileName);
           if (!localFile->open(QFile::WriteOnly )) {
            QMessageBox::warning(this, tr("应用程序"),
                             tr("无法读取文件 %1:\n%2.")
                             .arg(fileName)
                             .arg(localFile->errorString()));
            return;
        }  
      }else{
              return;
      }
    }
    
    if (bytesReceived < TotalBytes){
    bytesReceived += tcpServerConnection->bytesAvailable();
    inBlock = tcpServerConnection->readAll();
    localFile->write(inBlock);
    inBlock.resize(0);
    }
    
    if (bytesReceived == TotalBytes) {
        tcpServerConnection->close();
            }
}
离线x000zhiwei
只看该作者 4楼 发表于: 2010-05-06
小弟着急啊!希望大家帮忙分析下!谢谢各位!

再补充下: 传输文本文件小于几十K的时候,接收到的是空文件;大于的话,接收到的文件比实际发送的要小,文件后面的数据丢失了
离线dbzhang800

只看该作者 5楼 发表于: 2010-05-06
bool QAbstractSocket::flush ()
This function writes as much as possible from the internal write buffer to the underlying network socket, without blocking. If any data was written, this function returns true; otherwise false is returned.
离线x000zhiwei
只看该作者 6楼 发表于: 2010-05-06
你是说在发送端加flush( )  刷新下吗?我再试试。
之前,我在 if (bytesReceived == TotalBytes) {
        tcpServerConnection->close();
            }
前面加了一条语句 qDebug()<<bytesReceived;
显示的接受字节数和发送的是一样的;问题好像出在接受后从缓存写入文件这里,不知咋解决。烦请楼上高人再帮忙想想!谢谢了!
离线x000zhiwei
只看该作者 7楼 发表于: 2010-05-12
引用第5楼dbzhang800于2010-05-06 15:44发表的  :


加flush()也不管用啊!恳请高手指点啊!
离线x000zhiwei
只看该作者 8楼 发表于: 2010-05-13
怎么没有人回答呢?自己顶自己!
离线heqiangpc
只看该作者 9楼 发表于: 2010-07-08
我在用TCP发文件时,不知道怎么回事,文件在传输的过程中Server端就会收到一个disconnected()的信号,但是我在发送端没有调用disconnectFromHost啊,发送端在调用函数waiteForBytesWritten(-1)时会返回false. tcpSocket->errorString()会说是远程计算机已经关闭连接。我都搞了几天了都不知道是什么原因,哎。
离线liang6
只看该作者 10楼 发表于: 2010-12-01
发来源码瞅瞅呗   上传工程
离线lexdene
只看该作者 11楼 发表于: 2010-12-01
好深奥。帮顶。
快速回复
限100 字节
 
上一个 下一个