我应该从服务器获取一些 XML 数据说,
<?xml><a></a><?xml><a></a><?xml><a></a><?xml><a></a>
假设按以下顺序接收数据包
<?xml><a>
</a><?xml><a></a><?xml>
<a></a>
如何制定解析此类数据的逻辑?
我应该从服务器获取一些 XML 数据说,
<?xml><a></a><?xml><a></a><?xml><a></a><?xml><a></a>
假设按以下顺序接收数据包
<?xml><a>
</a><?xml><a></a><?xml>
<a></a>
如何制定解析此类数据的逻辑?
简短的回答是您不必担心订单;TCP 为您处理重组。
TCP 是一种流协议,每个数据包都包含一个序列号,允许网络堆栈以正确的顺序重新组合传入的数据包。它还将自动重新发送在传输过程中丢失或损坏的任何数据包。但是,与一次传输完整消息的 UDP 不同,TCP 只是一直发送数据直到连接关闭,没有协议级别的单个消息概念。
我认为您的问题不是关于订购,而是关于知道您何时收到所有数据。通常有两种方法可以解决这个问题。
首先,服务器可以在发送完数据后关闭连接。客户端发出请求,累积响应直到连接关闭,然后将它收到的所有数据传递给应用程序。
其次,应用程序可以通过标记每条消息的结尾或通过在每条消息的开头插入字节数来构建数据本身。接收器等待指定数量的字节到达并将它们传递给应用程序。
实际上还有第三种方法,但它容易出错并且通常被认为是不好的做法:客户端可以简单地等待直到它停止接收数据一段时间,假设超时表示消息结束。但这可能会在客户端等待超时时造成不必要的延迟,并且如果网络中存在较大的延迟,它也可能过早地指示消息结束。您应该将其视为一种故障保护,如果服务器在消息中间“消失”,则可以防止客户端挂起,或者如果其他方法都不起作用,您可以将其用作最后的手段。但是它很有可能会间歇性地失败,所以不要告诉任何人你从我这里听到的。:-)
祝你好运!