NodeJS: Quelle est la bonne façon de manipulation socket TCP flux ? Qui délimiteur dois-je utiliser?

De ce que j'ai compris ici, "V8 a une question de génération garbage collector. Déplace les objets qui s'étale sur toute au hasard. Nœud ne peut pas obtenir un pointeur de chaîne brute des données à écrire dans la prise." donc je ne devrait pas stocker de données provenant d'un flux TCP dans une chaîne de caractères, spécialement si cette chaîne devient plus grand que Math.pow(2,16) octets. (espère que je suis bien jusqu'à maintenant..)

Quelle est alors la meilleure façon de gérer toutes les données qui sont à venir à partir d'un socket TCP ? Jusqu'à présent, j'ai essayé d'utiliser _:_:_ comme un délimiteur parce que je pense que c'est quelque chose d'unique et de ne pas déranger les autres choses.

Un échantillon de données qui viendrait serait something_:_:_maybe a large text_:_:_ maybe tons of lines_:_:_more and more data

C'est ce que j'ai essayé de faire:

net = require('net');
var server = net.createServer(function (socket) {
socket.on('connect',function() {
console.log('someone connected');
buf = new Buffer(Math.pow(2,16));  //new buffer with size 2^16
socket.on('data',function(data) {
if (data.toString().search('_:_:_') === -1) {    //If there's no separator in the data that just arrived...
buf.write(data.toString());   //... write it on the buffer. it's part of another message that will come.
} else {        //if there is a separator in the data that arrived
parts = data.toString().split('_:_:_'); //the first part is the end of a previous message, the last part is the start of a message to be completed in the future. Parts between separators are independent messages
if (parts.length == 2) {
msg = buf.toString('utf-8',0,4) + parts[0];
console.log('MSG: '+ msg);
buf = (new Buffer(Math.pow(2,16))).write(parts[1]);
} else {
msg = buf.toString() + parts[0];
for (var i = 1; i <= parts.length -1; i++) {
if (i !== parts.length-1) {
msg = parts[i];
console.log('MSG: '+msg);
} else {
buf.write(parts[i]);
}
}
}
}
});
});
});
server.listen(9999);

Chaque fois que j'essaie de console.log('MSG' + msg), il permet d'imprimer l'ensemble de la mémoire tampon, il est donc inutile de voir si quelque chose a fonctionné.

Comment puis-je traiter les données de la bonne façon ? Serait le paresseux module de travail, même si ces données n'est pas en ligne orienté ? Est-il un autre module pour gérer les flux qui ne sont pas de ligne orientée ?

La présentation à laquelle vous avez accédé parle de rédaction informations pour les sockets. Vous le lisez, de sorte que les préoccupations sont différentes. Dans node.js 0.4.6, les données de rappel vous donne déjà un Tampon de travail, sauf si vous spécifiez un encodage, dans ce cas, vous obtiendrez une chaîne de caractères. Comment vous tenir à jour les données après ça dépend de ce que votre objectif réel est.
Est-ce à dire que je peux stocker les entrants tampons comme une chaîne de grande taille et n'ont pas de problèmes de performance ?

OriginalL'auteur João Pinto Jerónimo | 2011-08-12