1

これが可能かどうかはわかりませんが、ここに行きます。通常、私はこのような文字列を送信します...

Connection.IOHandler.WriteLn('alpha');
Connection.IOHandler.WriteLn('bravo');
Connection.IOHandler.WriteLn('charley');
//and so on..

しかし、一度に送信したい場合は、一度に送信してください。多分私はそれを文字列の配列に入れてから配列を送ることができます。

someStr : array[1..3] of string = ('alpha','bravo','charley');//this could be more

...

StrListMem := TMemoryStream.Create;
try

   StrListMem.WriteBuffer(someStr[0], Length(someStr));
   StrListMem.Position:=0;

   Connection.IOHandler.Write(StrListMem, 0, True);

finally
   StrListMem.Free;
end;

私はこの権利の方法がわかりません。誰かが例を挙げてくれるでしょうか?そして受信者(クライアント)がそれを読む方法。

編集:

ストリームの読み方にも問題があり、このコードの何が問題なのかわかりません。

クライアント:

msRecInfo: TMemoryStream;
  arrOf: Array of Char;

...

  msRecInfo := TMemoryStream.Create;
  try
    AContext.Connection.IOHandler.ReadStream(msRecInfo, -1, False);
    SetLength(arrOf, msRecInfo.Size div SizeOf(Char));

    msRecInfo.Position := 0;
    msRecInfo.ReadBuffer(arrOf[0], Length(arrOf) * SizeOf(Char));

  finally
    MessageBox(0,pChar(arrOf[0]),0,0);//memo1.Lines.Add(arrOf[0]);
    msRecInfo.Free;
  end;
4

1 に答える 1

2

配列全体を一挙にストリーミングするように書き込むことができます。あなたは実際にすでに正しいコードに近いコードを書いています

StrListMem := TMemoryStream.Create;
try
   for I := 0 to Length(someStr) - 1 do
   begin
     StrListMem.WriteBuffer(someStr[I][1], Length(someStr[I]) * SizeOf(Char));
     StrListMem.WriteBuffer(sLineBreak[1], Length(sLineBreak) * SizeOf(Char));
   end;

   StrListMem.Position:=0;    
   Connection.IOHandler.Write(StrListMem, 0, True);    
finally
   StrListMem.Free;
end;

または、データのみを操作し、トランスポート層を抽象化する場合 (読み取り、簡単なコーディング)、私のIMCを確認できます。いくつかのことを抽象化して、簡単にします。

編集:

元の OP コードと一致しているように見えるため、各文字列の後に改行文字を追加しました。私は手元に Delphi を持っていないので、やみくもにコードをコピーしないでください。

編集:

質問をもう一度読んだ後、彼の目標は一度に送信することだけであり、文字列配列の使用は必須ではないことに気付きました。そのため、より良い方法があります。

StrListMem := TStringList.Create;
try
  StrListMem.Add('alpha');
  StrListMem.Add('bravo');
  StrListMem.Add('charley');
  Connection.IOHandler.WriteBufferOpen;
  try
    Connection.IOHandler.Write(StrListMem);    
  finally
    Connection.IOHandler.WriteBufferClose;
  end;
finally
  StrListMem.Free;
end;

読むには

StrListMem := TStringList.Create;
try
  IdTCPClient1.IOHandler.ReadStrings(StrListMem);
finally
  StrListMem.Free;
end;

より簡単でクリーン:)

于 2013-10-20T07:04:31.810 に答える