1

INDY10 コンポーネントを使用して、1 つの tcp indy サーバーからクライアントに多くのファイルを転送する必要があります。TCP クライアントまたはサーバー通信のパラメータを設定して、転送速度を改善する方法はありますか。

ファイル サイズ : ~ 10 MBYte .... 50 Mybte

ファイル サイズに制限はありますか? 私の PC は WIN 7 x64 と 32 GBYTE RAM を使用しています 私たちのネットワークは LAN.100 他の場所 LAN は既に GIGABIT LAN に改善されています

  function SendStream(AContext: TIdContext; AStream: TStream): Boolean; overload;
  var
    StreamSize: LongInt;
  begin
    try
      Result := True;
      try
        StreamSize := (AStream.Size);

        // AStream.Seek(0, soFromBeginning);

        AContext.Connection.IOHandler.Write(LongInt(StreamSize));
        AContext.Connection.IOHandler.WriteBufferOpen;
        AContext.Connection.IOHandler.Write(AStream, 0, False);
        AContext.Connection.IOHandler.WriteBufferFlush;
      finally
        AContext.Connection.IOHandler.WriteBufferClose;
      end;
    except
      Result := False;
    end;
  end;
4

2 に答える 2

2

送信コードは次のように削減できます。

  function SendStream(AContext: TIdContext; AStream: TStream): Boolean;
  begin
    Result := True;
    try
      AContext.Connection.IOHandler.Write(AStream, 0, True);
    except
      Result := False;
    end;
  end;

3 番目のパラメーターにより、Indy はストリーム サイズを Integer または Int64 (TIdIOHandler.LargeStream プロパティの値に応じて) の値としてクライアントに書き込みます。

クライアントは、ストリーム サイズとストリームを次のように読み取ることができます。

// reads the stream size then reads the stream data
Client.IOHandler.ReadStream(MyStream, -1, False);

Delphi TidTCPServer および TidTCPClientで、転送方向のみが逆になっているレコードを転送していることがわかります)

于 2012-12-03T09:24:59.880 に答える
1

ストリームを直接送信し、作成中のバイトの別のコピーを保存します。特にあなたの例では、WriteBufferに言及している3行のコードを削除してください。

ストリームのサイズと同時クライアントの数によっては、実際には必要のない大きなバッファー コピーを使用して、メモリ マネージャーを大量に使用している可能性があります。大規模な転送での目標は、何かがストリーム全体を処理しなければならない回数を制限することです。

于 2012-12-02T16:39:18.540 に答える