从流中读取字节,并转换为字符串

时间:2014-07-30 17:50:45

标签: delphi tcp byte xmldocument indy10

我在从客户端读取流时遇到问题。我使用Delphi XE3和Indy 10。 此客户端向我发送标记的文本数据流,即XML格式。当我使用TIdTCPServer读取数据时,我的问题开始了。使用此代码:

if Acontext.Connection.IoHandler.InputbufferisEmpty then
begin
 Acontext.Connection.IoHandler.CheckforDataonSource(1000);
 Acontext.Connection.IoHandler.CheckForDisconnect;
 if Acontext.Connection.IoHandler.InputbufferisEmpty then Exit; 
end;
Acontext.Connection.Iohandler.ReadBytes(Abuffer,      
  Acontext.connection.ioHandler.Inputbuffer.size);
data := BytesToString(Abuffer, Tencoding.bigendianUnicode);

数据以BigEndianUnicode编码。我注意到,当我收到数据时,服务器会读取并显示2个“块”差异中的数据。如果服务器一直收到相同的数据,当我用BytesToString解析数据时,每次都会在同一个字符处“切换”数据。

以下是我得到的结果:

<rootNode>
  <Node1></Node1>
  <Node2></Node2>
  <
   Node3></Node3>
  <Node4></Node4>

当我将WideString分配给XMLDocument时,问题变得更大。我在文档错误的顶层获得了无效。

有时,我运行服务器并获取所有数据正确,没有此错误,但是当我关闭应用程序并再次运行时,服务器会收到损坏的数据。

对不起,我的英文。我需要一些帮助。

1 个答案:

答案 0 :(得分:3)

您只是在读取IOHandler.InputBuffer访问它时所遇到的任何原始字节,因此您可能无法读取整个XML,或者更糟糕的是您正在阅读更多遵循XML的数据。如果客户端是明智的,那么它应该在XML数据之前发送XML长度,或者在XML数据之后发送唯一的终止符。其中任何一个都可以让你完全自己阅读整个XML,而不必完全调用CheckforDataOnSource()(在大多数情况下你应该避免),例如:

len := AContext.Connection.IOHandler.ReadLongWord; // or however the XML length is sent
data := AContext.Connection.IOHandler.ReadString(len, IndyUTF16BigEndianEncoding);

或者:

data := AContext.Connection.IOHandler.ReadLn('the terminator here', IndyUTF16BigEndianEncoding);