2010-07-26 9 views
10

Je souhaite réaliser une simple connexion client-serveur en utilisant Nodejs. Mais j'ai rencontré le problème suivant.Nodejs streaming

Consultez le code

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."); 
}); 

Quand je lance Client.js je suis parfois un seul message 'ab' au lieu de deux messages 'a' et 'b'.

Existe-t-il une «bonne méthode» pour gérer cela?

+0

vous pouvez même recevoir 'ba' !! il n'y a pas de bénéficiaire pour recevoir des données dans l'ordre où vous les envoyez. –

+4

@MortezaM. en fait TCP/IP * donne la garantie * que les données seront reçues sur la commande qui a été envoyée, donc dans ce cas ce sera toujours 'ab'. – Kornel

Répondre

10

TCP est un protocole flux. Un seul write sur une extrémité du tuyau peut entraîner plusieurs "lectures" à l'autre extrémité, et l'inverse. Vous devez soit dire explicitement à l'autre côté combien d'octets vous envoyez en incluant la longueur dans le message; ou fournir des délimiteurs de message facilement reconnaissables. Dans tous les cas, vous devez lire en boucle.

+0

Donc, la seule «bonne méthode» est de concaténer les données entrantes et de les analyser comme un tout? J'ai pensé à cela, je veux juste être sûr qu'il n'y a pas d'autres méthodes :) – Dan

+2

Vous devez le traiter comme un flux. Analyser les octets comme ils viennent, réagir lorsque le message complet est trouvé. –