读书人

BCB6.0 使用IndyTcpClientIndyTcpSe

发布时间: 2012-02-27 10:00:22 作者: rapoo

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

读书人网 >C++ Builder

热点推荐