delphi indy的UDP传输的演示源码

合集下载
  1. 1、下载文档前请自行甄别文档内容的完整性,平台不提供额外的编辑、内容补充、找答案等附加服务。
  2. 2、"仅部分预览"的文档,不可在线预览部分如存在完整性等问题,可反馈申请退款(可完整预览的文档不适用该条件!)。
  3. 3、如文档侵犯您的权益,请联系客服反馈,我们会尽快为您处理(人工客服工作时间:9:00-18:30)。

/t810509

用Delphi编写点对点传文件程序

delphi indy的UDP传输的演示源码

2009-02-27 17:05

客户端:

var

cmd: string;

ASize, TotalSize: Int64;

AFileStream: TFileStream;

begin

IdTCPClient1.Host := Edit1.Text; //连接主机

IdTCPClient1.Port := StrToIntDef(Edit2.Text, 9925); //端口

IdTCPClient1.Connect; //连接

try

IdTCPClient1.WriteLn('BEGIN'); //提示服务器开始接收

cmd := IdTCPClient1.ReadLn;

//以“|”符号分离文件名

SaveDialog1.FileName := Copy(cmd, Pos('|', cmd) + 1, Length(cmd));

if not SaveDialog1.Execute then

begin

IdTCPClient1.WriteLn('CANCEL'); //告诉服务器取消

IdTCPClient1.Disconnect; //断开连接

exit;

end;

TotalSize := StrToInt(Copy(cmd, 0, Pos('|', cmd) - 1)); //分离文件大小

//建立文件流准备接收

AFileStream := TFileStream.Create(SaveDialog1.FileName, fmCreate);

try //循环开始接受

repeat

IdTCPClient1.WriteLn(IntToStr(AFileStream.Size));//发送当前传输的位置

ASize := Min(TotalSize - AFileStream.Size, IdTCPClient1.RecvBufferSize);

//选择剩余大小和缓冲区大小小的一个作为传输的大小

IdTCPClient1.ReadStream(AFileStream, ASize); //接收流

StatusBar1.SimpleText := Format('当前传输位置%d/大小%d', [AFileStream.Size, TotalSize]);

Application.ProcessMessages;

until AFileStream.Size = TotalSize; //大小一致了表示结束

finally

AFileStream.Free; //释放文件流

end;

IdTCPClient1.WriteLn('END'); //提示服务器传输完成

StatusBar1.SimpleText := '传输完成...';

except

StatusBar1.SimpleText := '连接服务器失败或者对方已经中断传输!';

end;

IdTCPClient1.Disconne

--------------------------------------------------------------------------------

服务器:

procedure Tfrm_Server.IdTCPServer1Execute(AThread: TIdPeerThread);

var

cmd: string; //接收到客户端的字符串信息

ASize: Integer; //需要传输的流大小

begin

with AThread.Connection do //已经连街上的一个进程

begin

cmd := UpperCase(ReadLn); //客户端发送的命令字符串

if cmd = 'BEGIN' then //开始传输

begin

//告诉远程传输文件的大小和文件名

WriteLn(Format('%d|%s', [AFileStream.Size, ExtractFileName(Edit1.Text)])); StatusBar1.SimpleText := '准备传输...';

Exit;

end;

if cmd = 'END' then

begin //传输完成

Button3.Click;

StatusBar1.SimpleText := '传输完成...';

Exit;

end;

if cmd = 'CANCEL' then

begin //传输取消

StatusBar1.SimpleText := '传输取消...';

//保持传输状态

Exit;

end;

//按照指定位置传输文件

AFileStream.Seek(StrToInT(cmd), soFromBeginning); //转到文件流传输的位置

ASize := Min(AFileStream.Size - AFileStream.Position, RecvBufferSize);

//计算需要发送的大小,Min()函数在Math单元

OpenWriteBuffer; //准备发送缓冲

WriteStream(AFileStream, false, false, ASize);

//注意这个函数的参数。

CloseWriteBuffer; //结束发送缓冲

StatusBar1.SimpleText := Format('当前传输位置%s/大小%d', [cmd, AFileStream.Size]);

相关文档
最新文档