Nodejs en streaming
Je veux réaliser une simple connexion client-serveur à l'aide de Nodejs.
Mais j'ai rencontré le problème suivant.
Examiner 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 le lance client.js parfois, j'ai un seul message "ab", au lieu de deux messages 'a' et 'b'.
Est-il un droit de méthode " pour faire face à cela?
source d'informationauteur Dan
Vous devez vous connecter pour publier un commentaire.
TCP est un flux protocole. Seul
write
sur une extrémité du tuyau peut aboutir à plusieurs "lectures" à l'autre extrémité, et dans l'autre sens. Vous devez indiquer explicitement à l'autre côté de combien d'octets que vous envoyez par dont la longueur dans le message; ou de fournir facilement reconnaissable message délimiteurs. En tout cas, vous avez besoin de lire en boucle.utiliser socket.écrire la valeur de retour et de rappel, comme indiqué ici https://nodejs.org/api/net.html#net_socket_write_data_encoding_callback pour savoir quand les données sont complètement vidées dans le noyau . Attendre que cela se produise et après l'appel de la deuxième écriture. de cette façon, vous vous assurez de la commande. Concernant le problème de la logique separartion de "a" et "b", vous pourriez concevoir et mettre en œuvre que le "protocole vous-même, c'est pas de la responsabilité du (de bas niveau) API socket.