使用tcp发送字符串数组

时间:2013-10-20 05:14:55

标签: delphi delphi-xe

我不确定这是否可行,但在这里。 通常我会发送这样的字符串......

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;

1 个答案:

答案 0 :(得分: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;

更简单,更清洁:)