2010-07-26 16 views
10

Quiero realizar una conexión simple cliente-servidor usando Nodejs. Pero me he encontrado con el siguiente problema.Nodejs streaming

considerar el Código

server.js:

var net = require('net'), 
    sys = require('sys'); 

    net.createServer(onConnection).listen(8124); 

    function onConnection(socket) { 
    socket.setNoDelay(true); 

    socket.addListener("connect", function() { 
     sys.puts('client connected: ' + this.remoteAddress); 
    }); 

    socket.addListener("data", function (data) { 
     sys.puts("message: \n" + data + "\n - end of msg."); 
    }); 

    socket.addListener("end", function() { 
     sys.puts('end of connection'); 
     this.end(); 
    }); 
    } 

    sys.puts('Server running at 127.0.0.1:8124'); 

Client.js:

var net = require('net'), 
sys = require('sys'); 

var stream = net.createConnection(8124); 
stream.addListener("connect", function(){ 
sys.puts('connected'); 

stream.write('a'); 
    stream.flush(); 
stream.write('b'); 
    stream.flush(); 

}); 

stream.addListener("data", function(data){ 
sys.puts("Message: \n" + data + "\n - end of msg."); 
}); 

Cuando corro Client.js a veces tengo sólo un mensaje 'ab' en lugar de dos mensajes 'a' y 'b'.

¿Hay algún "método correcto" para lidiar con eso?

+0

¡incluso puede recibir 'ba'! no hay beneficiario para recibir datos en el orden en que los envía. –

+4

@MortezaM. en realidad, TCP/IP * garantiza * que los datos se recibirán en el orden en que se enviaron, por lo que en este caso siempre serán 'ab'. – Kornel

Respuesta

10

TCP es un corriente protocolo. Solo write en un extremo de la tubería puede dar lugar a múltiples "lecturas" en el otro extremo, y viceversa. Debe indicar explícitamente al otro lado cuántos bytes está enviando incluyendo la longitud del mensaje; o proporcionar delimitadores de mensajes fácilmente reconocibles. En cualquier caso, debe leer en un bucle.

+0

Entonces, ¿el único "método correcto" es concatenar los datos entrantes y analizarlos como un todo? Pensé en esto, solo quiero estar seguro de que no hay otros métodos :) – Dan

+2

Tienes que tratarlo como una transmisión. Analice los bytes tal como vienen, reaccione cuando se encuentre el mensaje completo. –