IDTCPClient文件的程序文件传输!在线等!

flyingIam 2004-07-22 04:01:34
简单的说现在我传输过去的是如果是txt文件!打开就是乱码!但感觉里面的数字没变!别的传过去只是大小一样!文件打不开或者是乱码?
cliect 文件传送端
procedure DownLoadFileProc(AThread: TIdPeerThread);
var
TheFileName: string;
ThePosition: integer;
FromF: file of byte;
FileLen: integer;

begin
try
TheFileName := AThread.Connection.ReadLn(EOL);
ThePosition := AThread.Connection.ReadInteger;
except
AThread.Connection.Disconnect;
exit;
end;
if FileExists(TheFileName) then
begin
DownLoadThreadExecute(AThread,TheFileName, ThePosition);
end
else
begin
try
AThread.Connection.Write('文件不存在' + EOL);
AThread.Connection.Disconnect;
except
AThread.Connection.Disconnect;
end;
end;
end;

procedure DownLoadThreadExecute(AThread: TIdPeerThread; TheFileName: string; ThePosition:integer);
var
FromF: file ;
FileLen,BufferTotalNum: integer;
NumRead, NumWritten: Integer;
Buf: array[1..32768] of Char;
tmStr:Tmemorystream;
begin
try
AssignFile(FromF, TheFileName);
FileMode := 0;
Reset(FromF,1);
FileLen := FileSize(FromF);
Seek(FromF, ThePosition);
except
try
CloseFile(FromF);
except
end;
exit;
end;
try
AThread.Connection.Write('OK'+inttostr(FileLen-ThePosition)+EOL);
except
CloseFile(FromF);
exit;
end;
NumRead:=0;
BufferTotalNum:=ThePosition;

repeat
try
AThread.Connection.OpenWriteBuffer;
BlockRead(FromF, Buf, SizeOf(Buf), NumRead);
AThread.Connection.WriteBuffer(Buf, NumRead);
AThread.Connection.CloseWriteBuffer;
BufferTotalNum:=BufferTotalNum+NumRead;
except
CloseFile(FromF);
exit;
end;
until (BufferTotalNum=FileLen);
CloseFile(FromF);
if AThread.Connection.Connected then
AThread.Connection.Disconnect;

end;


server端 文件接收端

try //发送下载的文件
DownLoadTcp.Write('文件下载' + EOL); //1-------SendfileCMD
DownLoadTcp.Write(SrcouceDir.Text + FileNameText.Text + EOL); //2-------SendfileName
except
DownLoadTcp.Disconnect;
Animate1.Active := False;
beep;
Self.Caption := '提示:网络信息发送失败!';
exit;
end;
TmpFName := DownLoadDir.Text + FileNameText.Text;
//================================文件接续
try
if FileExists(TmpFName) then
begin
SaveFStream := TFileStream.Create(TmpFName, fmOpenReadWrite);
AlreadyReadLen := SaveFStream.Size;
end
else
begin
SaveFStream := TFileStream.Create(TmpFName, fmCreate);
AlreadyReadLen := 0;
end;
except
beep;
beep;
Self.Caption := '错误提示:请重新指定下载目录!';
exit;
end;
//===============================
try
DownLoadTcp.WriteInteger(AlreadyReadLen); //---send filePos文件位置
except
SaveFStream.free;
Animate1.Active := False;
DownLoadTcp.Disconnect;
Self.Caption := '错误提示:网络信息发送失败!';
exit;
end;

try
RetStr := DownloadTcp.ReadLn(EOL); //OK
except
SaveFStream.free;
DownLoadTcp.Disconnect;
Animate1.Active := False;
Self.Caption := '错误提示:远程网络断开,接收失败!';
exit;
end;

if copy(RetStr,1,2) = 'OK' then //------------------------读取接收标志
begin //^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^
//读数据------------------------开始-----
try
Delete(RetStr,1,2);
ReadFileLen:=strtoint(RetStr);//文件大小
except
SaveFStream.free;
DownLoadTcp.Disconnect;
Animate1.Active := False;
Self.Caption := '错误提示:远程网络断开,接收失败!';
exit;
end;
SaveFStream.Position := SaveFStream.Size;
ProgressBar1.Max := ReadFileLen + AlreadyReadLen;
ProgressBar1.Position := 0;
try
DownLoadTcp.ReadStream(SaveFStream, ReadFileLen);
except
SaveFStream.Free;
Animate1.Active := False;
DownLoadTcp.Disconnect;
Self.Caption := '错误提示:远程网络断开,接收失败!';
exit;
end;
SaveFStream.free; //下载成功
Bitbtn3.Enabled := True;
beep;
Self.Caption := '下载完毕! 共:' + IntToStr(ProgressBar1.Max) + '字节';
ProgressBar1.Position := ProgressBar1.Max;
Sleep(100);
DownLoadTcp.Disconnect;
Animate1.Active := False;
if checkBox1.Checked then Close;
exit;
end;

...全文
228 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
xiaoqlj 2004-10-12
  • 打赏
  • 举报
回复
乱码不是传输方法的原因。应该在于你的文件读写上。
fengren1980 2004-07-23
  • 打赏
  • 举报
回复
代码写的有点问题
RedLeave 2004-07-23
  • 打赏
  • 举报
回复
将ascIIfiler属性改为false
flyingIam 2004-07-22
  • 打赏
  • 举报
回复
我写了简化的源码!谁帮我解决还可以加分!谁要写邮箱!或发邮件给我!
我的邮箱是!flying_i_am79@sina.com hz@uni-info.net
msn
flying_i_am79@hotmail.com
flyingIam 2004-07-22
  • 打赏
  • 举报
回复
同样的方法!如果是IdTCPClient接收,TIdTCPServer传送就是好的!

像上述的代码如果是IdTCPClient传送,TIdTCPServer接收就出现乱码!

求救中!
flyingIam 2004-07-22
  • 打赏
  • 举报
回复
怎么我发出的问题!没人回答!高手呢?

5,386

社区成员

发帖
与我相关
我的任务
社区描述
Delphi 开发及应用
社区管理员
  • VCL组件开发及应用社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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