ファイルのダウンロードやアップロードのidtcp

ユニットUnit1は、

インタフェースが

使用する
  Windowsの、メッセージ、sysutilsの、バリアント、クラス、グラフィックス、コントロール、フォーム、
  ダイアログ、IdBaseComponent、IdComponent、IdTCPConnection、IdTCPClient、
  StdCtrls; 

入力
  TForm1 = クラス(TFormは)
    btnReceive:のTButtonと、
    IdTCPClient1:TIdTCPClient。
    btnSend:TButtonの。
    手順btnReceiveClick(送信者:TObjectを);
    手順FormCreate(送信者:TObjectを);
    手順btnSendClick(送信者:TObjectを);
  プライベート
    { プライベート宣言} 
  公共
    { 公開宣言} 
  終わります

VAR 
  をForm1:TForm1; 

実装

{ $ R * .DFM } 

手順TForm1.btnReceiveClick(送信者:TObjectを)。
VaRの
    rbyte:配列 [ 0 .. 4096 ] バイト。
    SFILE:TFileStream。
    iFileSize:整数; 
開始
  iFileSize: = IdTCPClient1.ReadInteger。

  SFILE: = TFileStream。作成し' xx.pdf ' 、fmCreateを)。
  iFileSizeながら > 4096は ない
  始まります
      IdTCPClient1.ReadBuffer(rbyte、4096)。// .ReadBuffer(rbyte、ILEN)。
      sFile.Write(rByte、4096 )。
      INC(iFileSize、 - 4096 )。
  エンド; 
  IdTCPClient1.ReadBuffer(rbyte、iFileSize)。// .ReadBuffer(rbyte、ILEN)。
  sFile.Write(rByte、iFileSize)。
  sFile.Free; 
  ShowMessage(' ファイルOK入手!' );
エンド; 

手順TForm1.FormCreate(送信者:TObjectを);
開始
//   IdTCPClient1.BoundIP:= '127.0.0.1'; 
//   IdTCPClient1.BoundPort:= 90011;

  IdTCPClient1.Host: = ' 127.0.0.1 ' 
  IdTCPClient1.Port: = 9000 ; 


  IdTcpClient1.Connect(5000 ); 
  self.Caption: = ' 启动' ;
エンド; 

手順TForm1.btnSendClick(送信者:TObjectを);
VAR 
    iFileHandle:整数; 
    iFileLen、CNT:整数; 
    BUF:配列 [ 0 .. 4096 ] バイト。

開始
//   IdTCPClient1.Host:='127.0.0.1'を; 
//   IdTCPClient1.Port:= 9000; 


    //IdTCPClient1.Connect(5000); 


  場合 IdTCPClient1.Connectedはその後、
  開始
    iFileHandle: =のFileOpen(' xx.pdf ' 、fmOpenReadを)。
    iFileLen: = FileSeek(iFileHandle、02)。// 2:soFromBeginning:ファイルの終わりから 
    FileSeek(iFileHandle、00 );
//     ProgressBar1.Max:= iFileLen。
//     ProgressBar1.Position:= 0; 
    IdTCPClient1.WriteLn(' xx.pdf ' + ' | ' + IntToStr(iFileLen));
    しばらく trueにはない
    始まり
      でApplication.ProcessMessagesを; 
      CNT: = FileRead関数(iFileHandle、BUF、4096 ); 
      IdTCPClient1.WriteBuffer(BUF、CNT); 
     // IdTCPClient1.WriteInteger(CNT); 
     
//       ProgressBar1.Position:= CNT + ProgressBar1.Position ; 
//       StatusBar1.Panels [0]の.text:= 'ファイル送信...'; 
      IF CNT < 4096  その後、
          BREAK ;
     エンド; 

    FileCloseを(iFileHandle); 
//     Label2.Caption:= 'ファイル転送が完了しました!'; 
//     StatusBar1.Panels [0]の.text:= 'ファイル転送が完了した!'; 
   エンド;
 エンド;

終わり






ユニットUnit1は、

インターフェイスは

使用しています
  Windowsの、メッセージ、sysutilsの、バリアント、クラス、グラフィックス、コントロール、フォーム、
  ダイアログ、StdCtrls、IdBaseComponent、IdComponent、IdTCPServerを。

入力
  TForm1 = クラス(TFormは)
    IdTCPServer1:TIdTCPServerと、
    手順IdTCPServer1Execute(AThread:TIdPeerThread)。
    手順FormCreate(送信者:TObjectを);
    手順IdTCPServer1Connect(AThread:TIdPeerThread)。
  プライベート
    { プライベート宣言} 
  公共
    { 公開宣言} 
  エンド

VAR
  Form1:TForm1、

実装

{ $ R&LT * DFMは} 
使用IdSocketHandleを; 


// サーバーが受信する
手順TForm1.IdTCPServer1Execute(AThread:TIdPeerThread);
 VARの
  :rbyte アレイ [ 0 .. 4096 ] バイト; 
  SFILE:TFileStream、
  CNT、CMDを、ファイルサイズ:整数; 
  STRファイル名:文字列;
 始める
    STR: = AThread.Connection.ReadLn;    // ファイルサイズとファイル名が受信

    CMD: = POS(' | '、STR); // 区切り文字を探します
    ファイル名:=コピー(文字列、1、cmd- 1); // ファイル名を抽出
    // IdTCPClient1.WriteLn(ExtractFileName(edtFileName.Text)+ '|' + IntToStr(iFileLen)); 
    ファイルサイズ:= StrToInt(コピー(STR 、CMD + 1、長さ(STR)-cmd + 1)); //は、ファイルサイズを抽出し
    たIFはMessageBox(0、PChar型(' ユーザー' + AThread.Connection.Socket.Binding.PeerIP + "は、"ファイルを転送するためにあなたを与えるために' + +ファイル名を' 「あなたは受け入れるか拒否する?)、ファイルを受け入れるように"、MB_YESNO または MB_ICONQUESTION)= ID_Yes その後、 // 受信するかどうかを尋ね
    始める
//       //初期化の進捗バー; =ファイルサイズ:ProgressBar1.Max 
//       ProgressBar1.Position:= 0; 
//       SaveDialog1.FileName:=ファイル名;デフォルトのファイル名を保存する場所を//も、指定したことを確認するにSaveDialog1.Executeは、前、またはファイル名がnullです
//       ; SaveDialog1.Execute 

      // = TFileStream.Create(SaveDialog1.FileName、fmCreate); //ストリーム書き込まれるファイルを作成します。SFILE 
      SFILE:= TFileStreamを作成します(ファイル名、fmCreate); // ファイルを作成するには、ストリーム書き込まれる 
      ファイルサイズながら> 4096が 行うを
      開始
        AThread.Connection.ReadBufferを(rbyte、4096); // ファイルストリーム読み込み 
        、sFile.Write(rByte 4096を);       // ファイルストリームを書き込む
      @   CNT:= AThread.Connection.ReadInteger; //は、送信側の進捗から最新の位置情報を受信する
@         ProgressBar1.Position:= CNT + ProgressBar1.Position; //進捗表示を更新
@         Label1.Caption:= '現在受信進捗..'; 
//         StatusBar1.Panels [0]の.text:= 'ファイル受信...'; 
        incが(ファイルサイズ、 -である4096 );
      エンド; 
      AThread.Connection.ReadBuffer (rbyte、ファイルサイズ); // .ReadBuffer(rbyte、ILEN); 
      sFile.Write(rByte、ファイルサイズ); 
      sFile.Free; 
//     StatusBar1.Panels [0]の.text:= '完了を受信したファイル!'; 
//     Label1.Caption:= 'ファイル受信完了!'; 
    エンド; 
   END;

手順TForm1.FormCreate(送信者:TObjectを);
 VARの
  H:TIdSocketHandle; 
始める
  開始
   IdTCPServer1.DefaultPort: = 9000 ;
 //    = IdTCPServer1.Bindings.Add; H 
//    h.IP:= '127.0.0.1を'; 
//    h.Port:= 90011; 
   IdTCPServer1.Active:= 真; 
   Self.Caption: = ' 開始' ;
   エンド;
 エンド; 

// サーバーは、ファイル送信
手順TForm1.IdTCPServer1Connect(AThread:TIdPeerThreadを);
 VAR 
  :;整数iFileHandle 
  、iFileLen CNT:整数; 
  bufは:配列 [ 0 .. 4096 ] バイト。
開始
    iFileHandle: =のFileOpen(' xx.pdf ' 、fmOpenRead)。
    iFileLen: = FileSeek(iFileHandle、02 )。
    FileSeek(iFileHandle、00 ); 
    AThread.Connection.WriteInteger(iFileLen)。
    しばらくDO 
    始める
        CNT: = FileRead関数(iFileHandle、BUF、4096 ); 
        AThread.Connection.WriteBuffer(BUF、CNT)。
        もし CNT < 4096  その後、
            休憩;
    エンド; 
    FileCloseを(iFileHandle)。
エンド; 

終わり

おすすめ

転載: www.cnblogs.com/tobetterlife/p/12169515.html