我正在使用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'
我需要在断线处打破这些东西,所以我没有不完整的消息。有没有办法告诉节点为我这样做?如果没有,是否有人有任何关于如何做到这一点的样本?
答案 0 :(得分:7)
我找到了一个名为“载体”的模块,它正是我所需要的。安装模块之后就像添加它一样简单:
carrier.carry(stream, function(line) {
console.log("line: "+line)
})
我在这里找到了答案:
http://nodetuts.com/tutorials/5-a-basic-tcp-chat-server.html
答案 1 :(得分:4)
由于TCP是流协议(而不是块协议),因此它不会在您认为是单个消息之间保持任何界限。如果您需要重新组合传入流中的高级消息,则接收方负责。
您可以通过添加一个将输入数据读入缓冲区的图层,然后在输入流中看到\r\n
时一次释放一行来完成此操作。
另外,如果您可以将流数据更改为只有一个分隔符(例如仅\n
),则缓冲代码可能会变得更简单一些。