【发布时间】:2020-03-13 12:18:39
【问题描述】:
目前,当我们通过 TCP 发送大数据时,data 事件会以块的形式接收它。有没有办法让我们能够检测到所有数据都已接收并返回完整数据。
【问题讨论】:
标签: javascript node.js sockets tcp
目前,当我们通过 TCP 发送大数据时,data 事件会以块的形式接收它。有没有办法让我们能够检测到所有数据都已接收并返回完整数据。
【问题讨论】:
标签: javascript node.js sockets tcp
目前,当我们通过 TCP 数据事件发送大数据时,会分块接收它。有没有办法让我们能够检测到所有数据都已接收并返回完整数据。
TCP 只是一个连续的数据流。除非您关闭连接并将关闭的连接用作数据完成的信号,否则 TCP 级别的给定传输没有开始或结束。
因此,如果您想知道给定的数据块在哪里开始和停止,您需要在发送的数据中设计一种方法以便知道这一点(本质上是构建您自己的小型迷你有线格式或协议)。有无数种不同的方法可以做到这一点,这也是我们在 TCP 之上构建了如此多不同协议的原因之一。两个最简单的方案是:
发送一定长度的数据包,然后发送那么多字节。然后接收者读取长度并知道什么时候读取了那么多字节,它拥有整个块。
使用某种不会出现在实际数据中的分隔符。例如,一些简单的协议使用换行符作为分隔符。您发送一堆文本,然后用换行符终止它。接收者读取数据,直到他们得到一个换行符,这告诉他们他们有一个完整的数据块。根据数据的类型,有许多可能的分隔符。
其他协议(例如 webSocket 或 socket.io)内置了基于消息的范例,为您完成这项工作。您在一端发送一条消息,然后在另一端接收整条消息。
根据您发送的数据类型(文本/二进制)、数据的长度以及数据的字符(是否存在可能的分隔符),某些选项或多或少是合适的在实际数据中)。
【讨论】: