【问题标题】:How to separate TCP socket messages in node.js如何在 node.js 中分离 TCP 套接字消息
【发布时间】:2011-12-25 09:56:34
【问题描述】:

我正在使用 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'

我需要在换行符处拆分内容,这样我就不会收到不完整的消息。有没有办法告诉节点为我做这件事?如果没有,有没有人有任何关于如何做到这一点的样本?

【问题讨论】:

    标签: sockets node.js


    【解决方案1】:

    我找到了一个名为“carrier”的模块,它可以满足我的需要。安装模块后,就像添加这个一样简单:

    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

    【讨论】:

      【解决方案2】:

      由于 TCP 是一个流协议(而不是一个块协议),它不会在您可能认为是单个消息的内容之间保持任何界限。如果您需要从传入流中重组高级消息,这是接收者的责任。

      您可以通过添加一个层来实现此目的,该层将输入数据读取到缓冲区中,然后在输入流中看到\r\n 时一次释放一行。

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

      【讨论】:

      • 您可能想说“消息”(应用层概念)而不是“数据包”(在 TCP 中具有特定含义)以避免混淆 -- 重新组装 数据包 进入流是 TCP 所做的。将该流转化为 messages 是应用程序所做的事情。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-03-31
      • 2019-03-31
      • 2012-12-15
      • 1970-01-01
      • 2017-06-05
      相关资源
      最近更新 更多