2012-07-20 86 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

分隔符是兩種封裝接收。