1

Indyを介してTMemoryStreamを送信するための最良の方法は何ですか?

現時点で私が試しているのは:

procedure TClientForm.IdTCPClient1Connected(Sender: TObject);
begin
  IdTCPClient1.IOHandler.Write(KStore.Size);
  KStore.Position := 0;
  IdTCPClient1.IOHandler.Write(KStore);

  Memo1.Lines.Add('Client connected with server');
end

そしてサーバー側で:

function MemoryStreamToString(M: TMemoryStream): string;
begin
  SetString(Result, PChar(M.Memory), M.Size div SizeOf(Char));
end;

procedure TClientForm.IdTCPServer1Connect(AContext: TIdContext);
var
  LStore: TMemoryStream;
  Size: Int64;
  LStore := TMemoryStream.Create;
  LStore.Position := 0;
  Size := AContext.Connection.IOHandler.ReadInt64();
  AContext.Connection.IOHandler.ReadStream(LStore,Size);
end;

しかし、エラーがないにもかかわらず、もう一方の端でそのメモリストリームを文字列関数に使用すると、????????????????????が返されます。保存先のテキストファイルにあります。

4

1 に答える 1

3

TIdIOHandler.Write(TStream)そしてあなたのためTIdIOHandler.ReadStream()にプロパティの送受信を処理することができTMemoryStream.Sizeます、例えば:

procedure TClientForm.IdTCPClient1Connected(Sender: TObject); 
begin 
  IdTCPClient1.IOHandler.LargeStream := True; 
  IdTCPClient1.IOHandler.Write(KStore, 0, True); 
  Memo1.Lines.Add('Client connected with server'); 
end;

function MemoryStreamToString(M: TMemoryStream): string; 
begin 
  SetString(Result, PChar(M.Memory), M.Size div SizeOf(Char)); 
end; 

procedure TClientForm.IdTCPServer1Connect(AContext: TIdContext); 
var 
  LStore: TMemoryStream; 
  S: String;
begin
  LStore := TMemoryStream.Create; 
  try
    AContext.Connection.IOHandler.LargeStream := True; 
    AContext.Connection.IOHandler.ReadStream(LStore, -1, False); 
    S := MemoryStreamToString(LStore); 
  finally
    LStore.Free;
  end;
end;

そうは言っても、エラーはからへの変換に関連しているとおっしゃいましTMemoryStreamString。実際の内容をTMemoryStream両端で見せてください。内容が期待したものではない可能性があります。にを格納したときにクライアントに最初から文字がTMemoryStream含まれているか、clienがエンコードされた文字をサーバーに送信していません。'?'StringTMemoryStreamUTF-16

于 2012-04-12T20:00:30.373 に答える