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

nevermorewish 2011-11-02 01:56:26
客户端像服务器传输视频文件,传输完不能播放,具体用uedit32看了下服务器上的文件开头部分比客户端多写了几个字节,
是不是命令也写进文件了?
还有uedit32查看很多字节都不对应。
服务端代码

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;
}
...全文
288 10 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
10 条回复
切换为时间正序
请发表友善的回复…
发表回复
bigfog 2011-11-09
  • 打赏
  • 举报
回复
立即发送应该是false
nevermorewish 2011-11-08
  • 打赏
  • 举报
回复
 char* buff=new char[ASize];
AFileStream->ReadBuffer(buff,ASize);
m_client->WriteBuffer(buff,ASize,true);
delete[] buff;

解决了,再问下writebuffer最后一个参数为true的时候是立即发送吗?

OpenWriteBuffer;
WriteBuffer
FlushWriteBuffer
CloseWriteBuffer;
这样写和单单写writebuffer有区别吗
royallii 2011-11-08
  • 打赏
  • 举报
回复
推荐楼主看下 http://topic.csdn.net/t/20060912/17/5017015.html。
zzbinfo 2011-11-07
  • 打赏
  • 举报
回复
你既然要分割发送就不要用流了
nevermorewish 2011-11-07
  • 打赏
  • 举报
回复
	m_client->WriteLn(infostr);    			//先发送文件大小文件名
m_client->WriteStream(AFileStream,false,true);//注意这个函数的参数。

单独这样发送是可以的,但是怎么分割文件发送,发送的时候我需要知道每秒的速度
zzbinfo 2011-11-03
  • 打赏
  • 举报
回复
怎么会多出来数据,这个多出来得总是在文件开头么?看看穿过来得文件大小是否正确,
zzbinfo 2011-11-03
  • 打赏
  • 举报
回复
你下个断点单步执行应该能看到代码中变量得变化,具体WriteLn 会不会和WriteStream得数据混淆就不知道,没有用过这个控件.你可以作个试验试试.
nevermorewish 2011-11-03
  • 打赏
  • 举报
回复
文件大小正确,文件头是多了几个字节,但是文件末尾会少了几个字节
源文件:
[Setting]
PreUploadTimeRange=20110101,
接受到的文件
2[Setting]
PreUploadTimeRange=2011010

上面的代码发和接受都没问题吗,
WriteLn 只会对应 ReadLn吗同样使用ReadSteam也应该能接受到的吧?
BCB6.0中调试时候怎么才能查看TMemoryStream 中的数据?




nevermorewish 2011-11-02
  • 打赏
  • 举报
回复
传输了小得txt文件
原先文件头为
[Setting]
传输后变成:
2[Setting]
zzbinfo 2011-11-02
  • 打赏
  • 举报
回复
先弄个小一点的几个字节的文件传送试试看.

13,871

社区成员

发帖
与我相关
我的任务
社区描述
C++ Builder相关内容讨论区
社区管理员
  • 基础类社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧