node.js缓冲tcp数据和分隔符

我试图写一个快速和肮脏的TCP服务器,并与分隔符有问题。 根据这个问题,我缓冲传入的数据,并寻找分隔符(在这种情况下'\ r \ n'。但是,当我telnet和发送消息

foo\r\nbar 

下面的服务器不能识别中间的分隔符,但在最后看到一个\ r \ n-我是在telnet的印象下发送一个\ n只。 当我通过ruby脚本发送消息时,即使在消息中存在\ r \ n,也不会在任何地方识别分隔符。

有一些jsstring处理行为,我需要被清除吗?

 var net = require("net"); var http = require('http'); var HOST = '127.0.0.1'; var PORT = 6969; var TCP_DELIMITER = '\r\n'; var TCP_BUFFER_SIZE = Math.pow(2,16); net.createServer(function(sock) { console.log('CONNECTED: ' + sock.remoteAddress +':'+ sock.remotePort); // To buffer tcp data see: // https://stackoverflow.com/questions/7034537/nodejs-what-is-the-proper-way-to-handling-tcp-socket-streams-which-delimiter buf = new Buffer(TCP_BUFFER_SIZE); //new buffer with size 2^16 processTCP = function(msg) { // process messages console.log("processTCP: "+msg); } // socket handlers sock.on('data', function(data) { // look for separator '\r\n' console.log("data='"+data+"'"); data = data.toString('utf-8'); if(data.indexOf(TCP_DELIMITER) == -1) { console.log("1 PART MSG, INCOMING"); buf.write(data.toString()); // write data to buffer } else { parts = data.toString().split(TCP_DELIMITER); console.log("Parts: "+parts); if (parts.length == 2) { console.log("2 PART MSG, INCOMING"); msg = buf.toString() + parts[0]; // and do something with message processTCP(msg); buf = (new Buffer(TCP_BUFFER_SIZE)).write(parts[1]); // write new, incomplete data to buffer } else { console.log(parts.length+" PART MSG, INCOMING"); msg = buf.toString() + parts[0]; processTCP(msg); for (var i = 1; i <= parts.length -1; i++) { if (i !== parts.length-1) { msg = parts[i]; processTCP(msg); } else { buf.write(parts[i]); } } } } console.log('DATA ' + sock.remoteAddress + ': ' + data); // Write the data back to the socket, the client will receive it as data from the server sock.write('You said "' + data + '"'); }); sock.on('close', function(data) { console.log('CLOSED: ' + sock.remoteAddress +' '+ sock.remotePort); }); }).listen(PORT, HOST); console.log('Server listening on ' + HOST +':'+ PORT); 

其实,你发布的代码没有问题,它确实工作正常。

当你使用telnet发送string“\ r \ n”时,它只是将它作为一个文字传递,所以我不太了解这个例子(也许你粘贴它?)。

另外,我在processTCP注释了console.log调用。

使用这个代码testing它(你可以直接从node.js的控制台运行它):

 require('net').connect(6969, '127.0.0.1').write('segment1\r\nsegment2'); 

我在服务器端得到的结果是:

 Server listening on 127.0.0.1:6969 CONNECTED: 127.0.0.1:34960 Parts: segment1,segment2 2 PART MSG, INCOMING DATA 127.0.0.1: segment1 segment2 CLOSED: undefined undefined 

显然,你的代码工作得很好。

如果您的服务器收到如下消息,则会出现问题:

ECHO我爱你\ r

\ n

分隔符是在两个包中收到的。