idtcp实现文件下载和上传
unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, IdBaseComponent, IdComponent, IdTCPConnection, IdTCPClient, StdCtrls; type TForm1 = class(TForm) btnReceive: TButton; IdTCPClient1: TIdTCPClient; btnSend: TButton; procedure btnReceiveClick(Sender: TObject); procedure FormCreate(Sender: TObject); procedure btnSendClick(Sender: TObject); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} procedure TForm1.btnReceiveClick(Sender: TObject); var rbyte:array[0..4096] of byte; sFile:TFileStream; iFileSize:integer; begin iFileSize:=IdTCPClient1.ReadInteger; sFile:=TFileStream.Create('xx.pdf',fmCreate); While iFileSize>4096 do begin IdTCPClient1.ReadBuffer(rbyte,4096);// .ReadBuffer(rbyte,iLen); sFile.Write(rByte,4096); inc(iFileSize,-4096); end; IdTCPClient1.ReadBuffer(rbyte,iFileSize);// .ReadBuffer(rbyte,iLen); sFile.Write(rByte,iFileSize); sFile.Free; ShowMessage('file get ok!'); end; procedure TForm1.FormCreate(Sender: TObject); begin // IdTCPClient1.BoundIP:= '127.0.0.1'; // IdTCPClient1.BoundPort:= 90011; IdTCPClient1.Host:= '127.0.0.1'; IdTCPClient1.Port:= 9000; IdTcpClient1.Connect(5000); self.Caption:= '启动'; end; procedure TForm1.btnSendClick(Sender: TObject); var iFileHandle:integer; iFileLen,cnt:integer; buf:array[0..4096] of byte; begin // IdTCPClient1.Host:='127.0.0.1'; // IdTCPClient1.Port:=9000; //IdTCPClient1.Connect(5000); if IdTCPClient1.Connected then begin iFileHandle:=FileOpen('xx.pdf',fmOpenRead); iFileLen:=FileSeek(iFileHandle,0,2); //2 :soFromBeginning : from the end of the file FileSeek(iFileHandle,0,0); // ProgressBar1.Max:=iFileLen; // ProgressBar1.Position := 0; IdTCPClient1.WriteLn('xx.pdf'+'|'+IntToStr(iFileLen)); while true do begin Application.ProcessMessages; cnt:=FileRead(iFileHandle,buf,4096); IdTCPClient1.WriteBuffer(buf,cnt); // IdTCPClient1.WriteInteger(cnt); // ProgressBar1.Position:=ProgressBar1.Position + cnt; // StatusBar1.Panels[0].Text:='正在传送文件...'; if cnt<4096 then break; end; FileClose(iFileHandle); // Label2.Caption:='文件传送完成!'; // StatusBar1.Panels[0].Text:='文件传送完成!'; end; end; end. unit Unit1; interface uses Windows, Messages, SysUtils, Variants, Classes, Graphics, Controls, Forms, Dialogs, StdCtrls, IdBaseComponent, IdComponent, IdTCPServer; type TForm1 = class(TForm) IdTCPServer1: TIdTCPServer; procedure IdTCPServer1Execute(AThread: TIdPeerThread); procedure FormCreate(Sender: TObject); procedure IdTCPServer1Connect(AThread: TIdPeerThread); private { Private declarations } public { Public declarations } end; var Form1: TForm1; implementation {$R *.dfm} uses IdSocketHandle; //server 接收 procedure TForm1.IdTCPServer1Execute(AThread: TIdPeerThread); var rbyte:array[0..4096] of byte; sFile:TFileStream; cnt,cmd,FileSize:integer; str,FileName:string; begin str:=AThread.Connection.ReadLn; //接收文件大小及文件名 cmd:=pos('|',str); //查找分隔符 FileName:=copy(str,1,cmd-1); //提取文件名 //IdTCPClient1.WriteLn(ExtractFileName(edtFileName.Text)+'|'+IntToStr(iFileLen)); FileSize:=StrToInt(copy(str,cmd+1,Length(str)-cmd+1)); //提取文件大小 if MessageBox(0,Pchar('用户 '+AThread.Connection.Socket.Binding.PeerIP+'要给您传送文件 "'+FileName+'" 您是接受还是拒绝?'),'文件接受',MB_YesNo or MB_ICONQUESTION)=ID_Yes then //询问是否接收 begin // ProgressBar1.Max:=FileSize; //初始化进度条 // ProgressBar1.Position:=0; // SaveDialog1.FileName:=FileName; //指定保存的默认文件名,一定要在 SaveDialog1.Execute;之前,不然文件名为空 // SaveDialog1.Execute; //sFile:=TFileStream.Create(SaveDialog1.FileName,fmCreate); //创建待写入的文件流 sFile:=TFileStream.Create(FileName,fmCreate); //创建待写入的文件流 While FileSize>4096 do begin AThread.Connection.ReadBuffer(rbyte,4096);// 读取文件流 sFile.Write(rByte,4096); //写入文件流 // cnt:=AThread.Connection.ReadInteger; //从发送端接收最新的进度位置信息 // ProgressBar1.Position:=ProgressBar1.Position+cnt; //更新显示进度 // Label1.Caption:='当前接收进度..'; // StatusBar1.Panels[0].Text:='正在接收文件中...'; inc(FileSize,-4096); end; AThread.Connection.ReadBuffer(rbyte,FileSize);// .ReadBuffer(rbyte,iLen); sFile.Write(rByte,FileSize); sFile.Free; // StatusBar1.Panels[0].Text:='文件接收完成!'; // Label1.Caption:='文件接收完成!'; end; END; procedure TForm1.FormCreate(Sender: TObject); var h:TIdSocketHandle; begin begin IdTCPServer1.DefaultPort:=9000; // h:= IdTCPServer1.Bindings.Add; // h.IP:= '127.0.0.1'; // h.Port:=90011; IdTCPServer1.Active:=True; Self.Caption:= '启动'; end; end; //服务端 发送文件 procedure TForm1.IdTCPServer1Connect(AThread: TIdPeerThread); var iFileHandle:integer; iFileLen,cnt:integer; buf:array[0..4096] of byte; begin iFileHandle:=FileOpen('xx.pdf',fmOpenRead); iFileLen:=FileSeek(iFileHandle,0,2); FileSeek(iFileHandle,0,0); AThread.Connection.WriteInteger(iFileLen); while true do begin cnt:=FileRead(iFileHandle,buf,4096); AThread.Connection.WriteBuffer(buf,cnt); if cnt<4096 then break; end; FileClose(iFileHandle); end; end.
书搞进脑袋 创新 创造; 积极