缓冲器,插座.的node.js

Chr*_*ans 3 sockets binary buffer tcp node.js

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

缓冲区据我所知,当从套接字向您的代码提供数据时,它将是迄今为止收到的任何数据(流而不是数据包).因此,当您阅读收到的数据时,可能会从发送的数据中删除.

即收到的数据{学校:["Long

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);
Run Code Online (Sandbox Code Playgroud)

非常感谢你的时间.

log*_*yth 5

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

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

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