2016-06-15 4 views
0

folgende Beispiel:nodejs: Werden TCP-Nachrichten atomisch gesendet/empfangen? Betrachten

Server:

var net = require('net'); 
var server = net.createServer(function(connection) { 
    console.log('client connected'); 
    connection.on('end', function() { 
     console.log('client disconnected'); 
    }); 
    connection.write('Hello World!\r\n'); 
    connection.pipe(connection); 
}); 
server.listen(8080, function() { 
    console.log('server is listening'); 
}); 

Client: 'Hallo Welt! \ R \ n'

var net = require('net'); 
var client = net.connect({port: 8080}, function() { 
    console.log('connected to server!'); 
}); 
client.on('data', function(data) { 
    console.log(data.toString()); 
    client.end(); 
}); 
client.on('end', function() { 
    console.log('disconnected from server'); 
}); 

Ist es, dass die Nachricht garantiert vom Client wird atomisch in einem Mes empfangen Salbei wenn client.on ('Daten', ...) heißt? Oder muss ich alle Nachrichten in einem temporären Puffer speichern und mein eigenes "Start" - und "Ende" -Muster angeben, um zu erkennen, dass eine vollständige Nachricht empfangen wurde?

Antwort

0

Nein, es ist nicht mit TCP-Protokoll garantiert. TCP ist Streaming-Protokoll, was bedeutet, dass es mehrere write() s in Ihrem Code im internen TCP-Puffer ansammeln kann. Es schreibt diese Chunks in Reihenfolge und respektiert nicht Ihre Nachrichtengrenzen.

Das Gleiche passiert im Client-Ende. Sie könnten mehrere write() Chunks in einem data Ereignis erhalten.

Sie müssen Ihr eigenes Protokoll implementieren, um jede Nachricht zu identifizieren. Google für tcp message boundary problem, um einige Implementierungsbeispiele zu finden.