我不确定这是否可行,但在这里。 通常我会发送这样的字符串......
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;
答案 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;
更简单,更清洁:)