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 ?
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
Vous devez vous connecter pour publier un commentaire.
Il a en effet été dit qu'il y a du travail supplémentaire se passe, car le Nœud a à prendre que de la mémoire tampon, puis le pousser dans v8/convertir en une chaîne de caractères. Cependant, en faisant un toString() sur le tampon n'est pas mieux. Il n'y a pas de bonne solution à ce droit maintenant, autant que je sache, surtout si votre objectif final est d'obtenir une chaîne de caractères et l'imbécile avec elle. C'est l'une des choses Ryan mentionné @ nodeconf comme un domaine où le travail doit être fait.
Comme pour le séparateur, vous pouvez choisir ce que vous voulez. Beaucoup de protocoles binaires choisir d'inclure un en-tête fixe, de sorte que vous pouvez mettre les choses dans une structure normale, dont un grand nombre de fois comprend une longueur. De cette façon, vous la coupez en dehors connu de l'en-tête et d'obtenir des informations sur le reste des données sans avoir à parcourir l'ensemble de la mémoire tampon. Avec un système comme cela, on peut utiliser un outil comme:
Que d'un côté, les tampons peuvent être accessibles via la syntaxe de tableau, et ils peuvent également être coupés en dehors .slice().
Enfin, vérifiez ici: https://github.com/joyent/node/wiki/modules -- trouver un module qui analyse un simple protocole tcp et semble faire du bien, et de lire quelques-code.
OriginalL'auteur Josh
Vous devez utiliser la nouvelle stream2 api. http://nodejs.org/api/stream.html
Voici quelques exemples utiles: https://github.com/substack/stream-handbook
https://github.com/lvgithub/stick
OriginalL'auteur Samson