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

时间:2011-12-25 01:30:04

标签: 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));
});

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

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'

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

2 个答案:

答案 0 :(得分:7)

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

carrier.carry(stream, function(line) {
    console.log("line: "+line)
})

我在这里找到了答案:

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

https://github.com/pgte/carrier

答案 1 :(得分:4)

由于TCP是流协议(而不是块协议),因此它不会在您认为是单个消息之间保持任何界限。如果您需要重新组合传入流中的高级消息,则接收方负责。

您可以通过添加一个将输入数据读入缓冲区的图层,然后在输入流中看到\r\n时一次释放一行来完成此操作。

另外,如果您可以将流数据更改为只有一个分隔符(例如仅\n),则缓冲代码可能会变得更简单一些。