4

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

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

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

vs数据发送{学校:[{“Longwood”,“Hillbrow”}]}

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

我的问题在这里:

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

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

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

非常感谢您的宝贵时间。

4

2 回答 2

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

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

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

于 2012-12-30T20:20:05.760 回答
1

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

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

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