• 设为首页
  • 点击收藏
  • 手机版
    手机扫一扫访问
    迪恩网络手机版
  • 关注官方公众号
    微信扫一扫关注
    公众号

DelphiXEIdTCPClient和IdTCPServer发送和接收文件

原作者: [db:作者] 来自: [db:来源] 收藏 邀请

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  更新时间:

 


鲜花

握手

雷人

路过

鸡蛋
该文章已有0人参与评论

请发表评论

全部评论

专题导读
上一篇:
Matlab:Toeplitz矩阵-向量乘法的快速傅里叶(FFT)算法发布时间:2022-07-18
下一篇:
Matlab(一).jpg转.ppm发布时间:2022-07-18
热门推荐
阅读排行榜

扫描微信二维码

查看手机版网站

随时了解更新最新资讯

139-2527-9053

在线客服(服务时间 9:00~18:00)

在线QQ客服
地址:深圳市南山区西丽大学城创智工业园
电邮:jeky_zhao#qq.com
移动电话:139-2527-9053

Powered by 互联科技 X3.4© 2001-2213 极客世界.|Sitemap