首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >将数据合并到2个或更多TCP/IP数据包中

将数据合并到2个或更多TCP/IP数据包中
EN

Stack Overflow用户
提问于 2012-04-05 13:51:06
回答 1查看 407关注 0票数 0

我应该从服务器获取一些XML数据,比如

代码语言:javascript
复制
     <?xml><a></a><?xml><a></a><?xml><a></a><?xml><a></a>

假设按以下顺序接收数据包

代码语言:javascript
复制
     <?xml><a>
     </a><?xml><a></a><?xml>
     <a></a>

我如何制定逻辑来解析这类数据?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2012-04-07 11:56:53

简而言之,您不需要担心顺序;TCP会为您处理重新组装。

TCP是一种流协议,每个数据包都包含一个序列号,允许网络堆栈以正确的顺序重组传入的数据包。它还将自动重新发送在传输过程中丢弃或损坏的任何数据包。但是,与一次传输一条完整消息的UDP不同,TCP只是在连接关闭之前一直发送数据,没有单独消息的协议级概念。

我认为你的问题不是关于排序,而是关于知道你何时收到了所有数据。通常有两种方法可以做到这一点。

首先,服务器可以在发送完数据后关闭连接。客户端发出请求,累积响应直到连接关闭,然后将它接收到的所有数据传递给应用程序。

其次,应用程序可以通过标记每条消息的结尾或在每条消息的开头插入字节计数来对数据本身进行帧处理。接收器等待指定数量的字节到达,并将它们传递给应用程序。

实际上还有第三种方法,但它容易出错,而且通常被认为是糟糕的实践:客户端可以简单地等待,直到它停止接收数据一段时间,假设超时指示消息的结束。但是,当客户端等待超时时,这可能会导致不必要的延迟,并且如果网络中存在较大的延迟,它还可能过早地指示消息的结束。您应该将其视为一种故障安全机制,可以防止客户端在消息中间“离开”时挂起,或者,如果其他方法都不起作用,您可以将其作为最后的手段。但是它很有可能会间歇性地失败,所以不要告诉任何人你是从我这里听到的。:-)

祝好运!

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/10023278

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档