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  更新時間:

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM