2012-12-30 167 views
3

我想利用Node.js中的TCP套接字与Lua程序进行通信。我试图让我的头脑有两个问题。首先缓冲区。根据我的理解,当数据从套接字提供给你的代码时,它将是迄今为止接收到的任何数据(一个数据流而不是数据包)。所以当你读取收到的数据时,可能会从发送的数据中分解出来。缓冲区,插座。 node.js

即数据接收 {学校: “龙

VS数据发送 {学校:[{” 长木”, “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); 

非常感谢您的时间。

+0

PS:我想从长远的问题道歉。花2天通过各种论坛,群组和其他职位曳,仍然没有一个了解之后,我想也许有人可能的方式,我会得到解释! :) –

回答

5
  1. 是的,你绝对可以用几个数据段结束。它完全取决于你在任何一端编写的代码。
  2. 我不完全按照“在写入之前使用缓冲区”所表达的意思。缓冲区只是纯粹的二进制数据,它们用于传入和传出数据。节点通常也接受用于发送的字符串,并假定在没有给出编码的情况下它们是UTF8。如果您致电setEncoding,您也可以收到字符串。
  3. 的OS具有用于TCP套接字上输入数据缓冲器,并且当所述缓冲器是满的(由节点排空太慢),它将停止接受数据包,直到有空间。

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

至于处理和分割数据,它是由你。 TCP只提供按照发送顺序到达的字节流。正如你所说的,你可以收集字节,当收到一个换行符时,你将所有内容都解析为JSON。这应该很好。您可以使用任何不会在JSON内弹出的字符。只要执行JSON序列化的程序不添加换行符,就会设置。作为“数据”被发射时,可以检查字符串换行,如果没有,然后将其添加到任何先前接收的数据,如果你找到它,然后把它分解了,加上现有的数据。

+0

非常感谢您的回复。我已经重写了问题二,希望它更清楚一点。我还添加了一个socket.write示例。我需要在发送之前将字符串转换为二进制,还是Node要处理所有这些? –

+0

@ChrisEvans更新'2.' – loganfsmyth

+0

辉煌!至于缓冲区,你可以看到我的意思的例子:https://github.com/Overtorment/NoobHub/blob/master/server/node.js我不确定如果字符串的附加好处无论如何都被Node接受。 –

1

缓冲区用于发送和接收信息。正如您已经注意到的那样,收到的数据可能是分散的。始终由代码将这些数据恢复成正确的部分。

完全有可能在缓冲区中接收两个数据块。通常情况下,你会得到某种分隔符(比如像你提到的一个新行)。我做的是这样的:

  1. 当数据到来时,它串联到一个接收到的数据缓冲区的末尾。
  2. 有一个从此缓冲区读取的功能,在您的逻辑数据包分隔符上进行拆分
  3. 验证该逻辑数据包。
  4. 如果该数据包是有效且完整的,则将事件提交到代码的更高级别部分,以获取完整的信息。将您的JSON全部解析为常规对象来引发此事件。