我正在使用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)
我需要在断线处打破东西,所以我没有不完整的消息.有没有办法告诉节点为我这样做?如果没有,有没有人有任何样本可以做到这一点?
我找到了一个名为"载体"的模块,它正是我所需要的.安装模块之后就像添加这个一样简单:
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
由于TCP是流协议(而不是块协议),因此它在您认为是单个消息的位置之间没有任何界限。如果您需要从传入流中重组高级消息,这是接收方的责任。
您可以通过添加一层将输入数据读取到缓冲区中,然后每次\r\n
在输入流中看到a时释放一行来做到这一点。
顺便说一句,如果您可以将流数据更改为仅具有一个分隔符(例如,\n
仅一个),则缓冲代码可能会变得更加简单。
归档时间: |
|
查看次数: |
4572 次 |
最近记录: |