BCB6.0 使用IndyTcpClient,IndyTcpServer传输文件有关问题
BCB6.0 使用IndyTcpClient,IndyTcpServer传输文件问题
客户端像服务器传输视频文件,传输完不能播放,具体用uedit32看了下服务器上的文件开头部分比客户端多写了几个字节,
是不是命令也写进文件了?
还有uedit32查看很多字节都不对应。
服务端代码
客户端:
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.****.net/t/20060912/17/5017015.html。
------解决方案--------------------
立即发送应该是false
客户端像服务器传输视频文件,传输完不能播放,具体用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.****.net/t/20060912/17/5017015.html。
------解决方案--------------------
立即发送应该是false