首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 开发语言 > C++ Builder >

BCB6.0 使用IndyTcpClient,IndyTcpServer传输文件有关问题

2012-02-27 
BCB6.0 使用IndyTcpClient,IndyTcpServer传输文件问题客户端像服务器传输视频文件,传输完不能播放,具体用u

BCB6.0 使用IndyTcpClient,IndyTcpServer传输文件问题
客户端像服务器传输视频文件,传输完不能播放,具体用uedit32看了下服务器上的文件开头部分比客户端多写了几个字节,
是不是命令也写进文件了?
还有uedit32查看很多字节都不对应。
服务端代码

C/C++ code
void __fastcall TUpLoadServer::IdTCPServer1Execute(TIdPeerThread *AThread){    AnsiString Cmd,FileName;    TFileStream* readfile;    int FileSize=0;    if(!AThread->Connection->Connected()){return;}    int recvsize=AThread->Connection->RecvBufferSize;    Cmd=AThread->Connection->ReadLn();              //获得命令文件    FileName=TComFun::GetCMDType(Cmd,";");    try {       FileSize=StrToInt(TComFun::GetFileSize(Cmd,";"));           //获取文件大小    } catch (...) {    }    if(FileExists(FileName))    {        DeleteFile(FileName);    }    try    {        readfile=new TFileStream(GetFilePath(FileName),fmCreate);    //获得文件路径加上服务器文件夹路径        readfile->Seek(0,soFromBeginning);    }    catch(...)    {    }    int ASize=0;     while (readfile->Position<FileSize)                           //循环接收文件     {            ASize=TComFun::Min(32768,FileSize-readfile->Position);              AThread->Connection->ReadStream(readfile,ASize,false);    }    AThread->Connection->Disconnect();    delete readfile;}

客户端:
AnsiString infostr=m_recvfilename+";"+IntToStr(filesize);
m_client->WriteLn(infostr); //先发送文件大小文件名
  AnsiString SpeedStr;
while (AFileStream->Position<filesize) //循环发送文件
{
  TMemoryStream *AStream=new TMemoryStream();
  ASize= Min(filesize-AFileStream->Position,32768);
  AStream->CopyFrom(AFileStream,ASize);
  AStream->Seek(0,soFromBeginning);
  m_client->WriteStream(AStream,false,true);//注意这个函数的参数。
  iRcvSizeForSpeed=iRcvSizeForSpeed+ASize;
  if(m_retspeed!=NULL)
  {
  try
  {
  float time=(GetTickCount()-iStart);
  int speed=(int)((float)iRcvSizeForSpeed/time);
  SpeedStr.sprintf("%dKB/秒",speed);

  iTotalTranSize=iTotalTranSize+ASize;
  m_retspeed(m_filepath,SpeedStr,iTotalTranSize,filesize); //回调函数输出上传速度
  }
  catch(...)
  {}

  }
  iRcvSizeForSpeed=0;
  iStart=GetTickCount();
  delete AStream;
}

[解决办法]
你既然要分割发送就不要用流了
[解决办法]
推荐楼主看下 http://topic.csdn.net/t/20060912/17/5017015.html。
[解决办法]
立即发送应该是false

热点排行