【问题标题】:Buffers, sockets. node.js缓冲区,套接字。节点.js
【发布时间】:2012-12-15 03:55:57
【问题描述】:

我正在尝试利用 Node.js 中的 TCP 套接字与 Lua 程序进行通信。我试图解决两个问题。首先是缓冲区。

缓冲区 据我了解,当从套接字向您的代码提供数据时,它将是迄今为止收到的任何数据(流而不是数据包)。因此,当您读取接收到的数据时,它可能与发送的数据不同。

即收到的数据 {学校:[“长”

vs 发送的数据 { 学校 : [{"Longwood", "Hillbrow"}] }

解决此问题的方法是将您的数据放入“缓冲区”,并通过您使用的任何方法将其拆分以显示该信息的结尾。通常看起来是新行。

我的问题在这里:

  1. 您能否在缓冲区中有更多 2 个或更多完整的数据部分,您将如何处理? For 循环?
  2. 数据离开套接字时似乎存在同样的问题。然而,我注意到在其他代码示例中,人们在写入套接字之前使用 Node.js Buffer。为什么这不用于传入数据?
  3. 如果写入的数据多于无法处理的数据,Node 会为您处理这个问题,还是您需要想出一个方法。

最后我似乎误解了数据方面。发送和接收的所有数据是否都需要转换为二进制并返回?我希望只来回发送 JSON 数据。我想这就是我的困惑。例如:

var myQuestion = "Is this acceptable and will I encounter any issues?
socket.write(myQuestion);

非常感谢您的宝贵时间。

【问题讨论】:

  • PS:我想为这个冗长的问题道歉。在花了 2 天时间浏览各种论坛、群组和其他帖子但仍然没有理解之后,我想也许有人可以用我会得到的方式来解释它! :)

标签: node.js sockets tcp binary buffer


【解决方案1】:
  1. 是的,您肯定会得到几个数据部分。这完全取决于您在任一端编写的代码。
  2. 我不太理解您所说的“在写入前使用缓冲区”的意思。缓冲区只是纯二进制数据,它们用于传入和传出数据。 Node 通常也接受用于发送的字符串,如果没有给出编码,则假定它们是 UTF8。如果您拨打setEncoding,您也可以在接收时获取字符串。
  3. 操作系统为 TCP 套接字上的传入数据提供缓冲区,当缓冲区已满(节点清空速度太慢)时,它将停止接受数据包,直到有空间为止。

首先,Buffer 是二进制的。缓冲区只是一个字节数组,仅此而已。缓冲区可以从字符串创建,并且在某些情况下节点会自动执行此操作。就您而言,我建议您致电socket.setEncoding('utf8')。这将自动将传入的数据转换为字符串以简化您的解析。

就处理和拆分数据而言,这取决于您。 TCP 仅提供按发送顺序到达的字节流。正如您所说,您可以收集字节,当收到换行符时,您可以获取之前的所有内容并将其解析为 JSON。这应该可以正常工作。您可以使用任何不会在 JSON 中弹出的字符。只要执行 JSON 序列化的程序不添加换行符,就可以了。发出“数据”时,您可以检查字符串是否有换行符,如果没有,则将其添加到任何先前接收到的数据中,如果找到,则将其拆分,添加现有数据。

【讨论】:

  • 非常感谢您的回复。我已经重写了第二个问题,希望它更清楚一点。我还添加了一个 socket.write 示例。我需要在发送之前将字符串转换为二进制,还是 Node 会处理所有这些?
  • 太棒了!关于缓冲区,您可以在这里看到我的意思的一个示例:github.com/Overtorment/NoobHub/blob/master/server/node.js 如果字符串被 Node 接受,我不确定是否会带来额外的好处。
  • @ChrisEvans Gotcha。在这种情况下,当接收到数据时,它会被复制到一个单独的缓冲区中。该缓冲区根本不直接用于发送或接收。它用作解析数据的缓存。 Node 接受字符串,否则你最终会得到更多样板,所以这是有道理的。
【解决方案2】:

缓冲区用于发送和接收信息。正如您所注意到的,收到的数据可能是零散的。将这些数据恢复到正确的部分始终取决于您的代码。

完全有可能在缓冲区中接收到两个数据块。通常,您会有某种定界符(例如新行,就像您提到的那样)。我要做的是:

  1. 当数据进入时,将其连接到接收数据缓冲区的末尾。
  2. 有一个函数从这个缓冲区中读取,在你的逻辑数据包分隔符上拆分
  3. 验证该逻辑数据包。
  4. 如果该数据包有效且完整,则向代码的更高级别部分引发一个事件,表明已收到完整的信息。引发此事件,并将您的 JSON 全部解析为常规对象。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-22
    • 1970-01-01
    • 2012-09-25
    • 2021-11-02
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多