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;
}
...全文
335 10 打赏 收藏 举报
写回复
用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
  • 打赏
  • 举报
回复
先弄个小一点的几个字节的文件传送试试看.
内容概要:本文研究了计及需求侧响应的日前、日内两阶段鲁棒备用优化问题,提出了一种基于数据驱动的两阶段分布鲁棒优化方法,结合1-范数和∞-范数构造不确定性集合,有效刻画风电、光伏出力及负荷等多重不确定因素的波动特性。研究构建了电热综合能源系统的联合优化模型,通过协调日前调度计划与日内实时调整,充分发挥需求侧响应资源的灵活调节能力,提升系统在不确定性环境下的备用充裕性与运行鲁棒性,并采用Matlab进行建模与仿真验证,结果表明该方法在保障系统安全的同时显著改善了经济性。; 适合人群:具备电力系统分析、优化理论基础及Matlab编程能力的研究生、科研人员,以及从事新型电力系统调度、综合能源系统规划与运行的工程技术人员。; 使用场景及目标:①应用于高比例可再生能源接入背景下电力系统备用容量的优化配置;②为综合能源系统在多重不确定性下的鲁棒调度提供决策支持;③支撑需求侧资源参与系统辅助服务的机制设计与仿真验证,推动源荷互动协调发展。; 阅读建议:建议读者结合Matlab代码深入理解两阶段鲁棒优化的建模过程,重点关注不确定性集构建、鲁棒约束转化及C&CG等求解算法的实现细节,可进一步拓展至其他分布鲁棒优化形式或耦合更多能源形式的综合能源系统场景。

13,871

社区成员

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

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