如何在node.js中分隔TCP套接字消息

Ant*_*ebb 6 sockets node.js

我正在使用TCP套接字切割牙齿,并且对于消息如何到达我的应用程序感到困惑.好像他们被打破了.谁知道我怎么能最好地和他们一起加入呢?所有消息都以换行符分隔(\ r \n)

var stream = net.createConnection(port,host); 
stream.setEncoding("utf8");

stream.on('data', function(chunk){
    console.log('data: ' + sys.inspect(chunk));
});
Run Code Online (Sandbox Code Playgroud)

转储到控制台的示例如下所示:

data: '0'
data: '5293800791D04\r'
data: '\n'
data: '053138007928F1\r\n'
data: '05313800012869\r\n'
data: '052E3800790E0E\r\n'
data: '052E3800010E86\r\n'
data: '05223'
data: '8007933F5\r\n'
data: '05213800791019\r\n'
data: '05213800795C795B79265A\r\n'
data: '05213800011091\r\n'
Run Code Online (Sandbox Code Playgroud)

我需要在断线处打破东西,所以我没有不完整的消息.有没有办法告诉节点为我这样做?如果没有,有没有人有任何样本可以做到这一点?

Ant*_*ebb 7

我找到了一个名为"载体"的模块,它正是我所需要的.安装模块之后就像添加这个一样简单:

carrier.carry(stream, function(line) {
    console.log("line: "+line)
})
Run Code Online (Sandbox Code Playgroud)

我在这里找到了答案:

http://nodetuts.com/tutorials/5-a-basic-tcp-chat-server.html

https://github.com/pgte/carrier


Gre*_*ill 5

由于TCP是流协议(而不是块协议),因此它在您认为是单个消息的位置之间没有任何界限。如果您需要从传入流中重组高级消息,这是接收方的责任。

您可以通过添加一层将输入数据读取到缓冲区中,然后每次\r\n在输入流中看到a时释放一行来做到这一点。

顺便说一句,如果您可以将流数据更改为仅具有一个分隔符(例如,\n仅一个),则缓冲代码可能会变得更加简单。

  • 您可能要说“消息”(应用程序层概念)而不是“数据包”(在TCP中具有特定含义),以避免混淆-TCP将数据包*重组为流。将流转换为* messages *是应用程序要做的事情。 (2认同)