2012-07-20 49 views
2

我想写一个快速和肮脏的tcp服务器,并与分隔符有问题。每this question我缓冲输入数据并寻找分隔符(在这种情况下,“\ r \ n”。然而,当我在Telnet和发送消息node.js缓冲tcp数据和分隔符

foo\r\nbar 

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

是有一些JS字符串处理的行为,我需要被awared的?

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); 

回答

0

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

当你使用telnet发送字符串“\ r \ n”时,它只是将它作为文字传递,所以我并不真正了解该示例(可能是你粘贴了它?)。

另外,我在processTCP中注释了console.log致电。

测试它使用此代码(可以直接从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 

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

0

有一个问题,如果你的服务器收到消息象下面这样:

ECHO,我爱你\ r

\ n

分隔符是两种封装接收。