Delphi XE IdTCPClient和IdTCPServer 发送和接收文件
Delphi XE IdTCPClient和IdTCPServer 发送和接收文件
1、IdTCPClient1 发送示例
var iFileHandle: integer; iFileLen, cnt: integer; buf: TIdBytes; lfilename: string; ln: Cardinal; begin if dlgOpen1.Execute then begin lfilename := dlgOpen1.FileName; end; if lfilename <> '' then begin SetLength(buf, 4096); iFileHandle := FileOpen(lfilename, fmOpenRead); iFileLen := FileSeek(iFileHandle, 0, 2); FileSeek(iFileHandle, 0, 0); ProgressBar1.Max := iFileLen; ProgressBar1.Position := 0; IdTCPClient1.IOHandler.WriteLn(ExtractFileName(lfilename) + '|' + IntToStr(iFileLen)); while true do begin Application.ProcessMessages; cnt := FileRead(iFileHandle, buf[0], 4096); ln := GetLastError; IdTCPClient1.IOHandler.Write(buf, cnt); ProgressBar1.Position := ProgressBar1.Position + cnt; mmo1.Lines.Add('正在传送文件...' + DateTimeToStr(Now)); if cnt < 4096 then break; end; FileClose(iFileHandle); mmo1.Lines.Add('文件传送完成!' + DateTimeToStr(Now)); SetLength(buf, 0); end; end;
2、IdTCPServer 接收 示例
procedure TForm1.IdTCPServer1Execute(AContext: TIdContext); var rbyte: TIdBytes; sFile: TFileStream; cmd, FileSize: integer; str, FileName: string; begin if not TIdYarnOfThread(AContext.Yarn).Thread.Terminated and AContext.Connection.Connected then //注意这里 begin with AContext.Connection do begin try str := IOHandler.ReadLn; //接收文件大小及文件名 cmd := pos('|', str); //查找分隔符 FileName := copy(str, 1, cmd - 1); //提取文件名 FileSize := StrToInt(copy(str, cmd + 1, Length(str) - cmd + 1)); //提取文件大小 sFile := TFileStream.Create(ExtractFilePath(ParamStr(0)) + '\' + FileName, fmCreate); while FileSize > 4096 do begin Application.ProcessMessages; IOHandler.ReadBytes(rbyte, 4096,False); // 读取文件流 这里要注意 必须 false sFile.Write(rbyte[0], 4096); //写入文件流 mmo1.Lines.Add('正在接收文件中...' + DateTimeToStr(Now)); inc(FileSize, -4096); end; IOHandler.readbytes(rbyte, FileSize); sFile.Write(rbyte[0], FileSize); sFile.Free; mmo1.Lines.Add('文件接收完成!' + DateTimeToStr(Now)); finally end; end; end; end;
创建时间:2020.06.23 更新时间: