2013-10-20 170 views
1

我不确定这是否可能,但在这里。 通常我发送的字符串是这样的...使用tcp发送字符串数组

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; 

回答

2

你可以写全阵列一举以流。如果你想只用数据和抽象传输层以外的地方工作(阅读,便于用户进行编码),你可以看看我的IMC实际上,你已经写了近一个正确的代码

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; 

或者。它为你抽象了一些东西,使其更容易。

编辑:

我加入了换行符每个字符串后,它似乎与原来的OP代码一致。我手边没有德尔福,所以请不要盲目复制代码。

编辑:

阅读问题后,我再次意识到,他的目标是只在一个去发送它,它不是强制使用的字符串数组。所以有一个更好的方法来做到这一点。

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; 

更容易和更清洁的:)

+0

这似乎是OP希望每个字符串后,新的生产线。 –

+0

嗨,谢谢你的回复,我知道我问了很多好处,但是你能不能帮我解释一下客户端如何阅读它?我添加了我的客户端代码。 – user2798455

+0

我更新了答案。基本上无论发送数据的方式如何,都是一样的。 – Runner