我在从客户端读取流时遇到问题。我使用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时,问题变得更大。我在文档错误的顶层获得了无效。
有时,我运行服务器并获取所有数据正确,没有此错误,但是当我关闭应用程序并再次运行时,服务器会收到损坏的数据。
对不起,我的英文。我需要一些帮助。
答案 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);