2010-07-26 16 views
10

Chcę zrealizować proste połączenie klient-serwer za pomocą Nodejs. Ale napotkałem następujący problem.Nodejs streaming

Rozważmy kod

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

Kiedy biegnę client.js I czasami tylko jeden komunikat 'ab' zamiast dwie wiadomości "a" i "b".

Czy istnieje "właściwa metoda", aby sobie z tym poradzić?

+0

możesz nawet otrzymać "ba" !! nie ma osób uprawnionych do otrzymywania danych w kolejności ich wysyłania. –

+4

@MezezaM. w rzeczywistości protokół TCP/IP * daje gwarancję *, że dane zostaną odebrane w zamówieniu, które zostało wysłane, więc w tym przypadku zawsze będzie to "ab". – Kornel

Odpowiedz

10

Protokół TCP to protokół . Pojedynczy write na jednym końcu rury może spowodować wiele "odczytów" na drugim końcu i na odwrót. Musisz jednoznacznie powiedzieć drugiej stronie, ile wysyłanych bajtów zawiera długość wiadomości; lub zapewniają łatwo rozpoznawalne ograniczniki wiadomości. W każdym razie musisz przeczytać w pętli.

+0

A więc jedyną "właściwą metodą" jest łączenie danych przychodzących i analizowanie jej jako całości? Pomyślałem o tym, chcę tylko mieć pewność, że nie ma innych metod :) – Dan

+2

Musisz traktować to jako strumień. Parsuj bajty w miarę ich pojawiania się, reaguj, gdy zostanie znaleziony kompletny komunikat. –