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 回答