【问题标题】:Reading bytes from stream, and convert to string从流中读取字节,并转换为字符串
【发布时间】:2014-07-30 17:50:44
【问题描述】:

我在从客户端读取流时遇到问题。我使用带有 Indy 10 的 Delphi XE3。 这个客户端,给我发送一个标记的文本数据流,它是 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 时,问题变得更大。我在文档错误的顶层得到一个 Invalid。

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

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

【问题讨论】:

  • 您可以发布客户端代码吗?看起来它没有被刷新。
  • 它是一个第三方软件,只有软件和一些说明消息格式和编码的文档。仅此而已。
  • 文档对消息格式有什么说法?这很重要,因为它会影响您编写阅读逻辑的方式。
  • 消息可以定义用于其文本内容的编码,但协议定义了消息如何在 TCP 连接上构建。那么协议是如何定义的呢?消息数据是如何成帧的?你能提供实际的文件吗?还是捕获您尝试读取的原始 TCP 数据?
  • 必须说明它们是如何传输的,否则没有人知道如何与这个客户端交互。

标签: delphi tcp byte xmldocument indy10


【解决方案1】:

在您访问它的那一刻,您只是在读取碰巧在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);

【讨论】:

  • 如果我使用 ReadLongWord,服务器会捕获一个数字列表,我不知道这是所有消息的长度,还是每行的长度。
  • 这是一个例子来说明一个观点,我没有说它会解决你的问题。如果不了解有关您的客户使用的实际协议的更多信息,任何人都无法帮助您解决此问题。有多种可能的实现,使用哪一种取决于协议。
猜你喜欢
  • 2014-05-20
  • 1970-01-01
  • 1970-01-01
  • 2020-11-04
  • 1970-01-01
  • 2012-06-24
  • 1970-01-01
  • 1970-01-01
  • 2016-11-18
相关资源
最近更新 更多