Node.js: Connexion à un serveur utilisant les prises

Je commence à jouer avec Node.js aujourd'hui et je pensais que je commencerais par ce que je pensais être un script simple: se connecter à un serveur via des sockets, envoyer un peu de données et le recevoir. Je crée un utilitaire de ligne de commande. Rien dans le navigateur.

Un exemple de serveur serait memcached, beanstalkd, etc. Il semble que le module net soit le bon outil pour le travail, mais je suis encore un peu flou sur la manière de faire Node.js. Une aide sera appréciée.

Mise à jour # 1

Permettez-moi de voir si je peux casser cette question en quelques petites questions. Je déteste même de poser des questions comme celle-ci, mais la documentation de Node.js est très rare et la plupart des documents écrits il y a 6 mois sont déjà périmés.

1) Je peux donc utiliser net.stream.write () pour envoyer des données au serveur distant, mais je ne sais pas comment réagir. Je ne suis même pas sûr de savoir comment tester lorsque write () est terminé, car il ne nécessite pas de rappel.

2) Quelques indices sur la façon dont l'événement entier. La chose de l'article est formidable. Je pense que c'est vraiment la pierre clé que je manque de tout.

Mise à jour # 2

C'est là que je suis toujours confus sur la mise en œuvre d'un programme client. Permettez-moi de décrire une demande d'envoi typique => obtenir un système de réponse:

1) Je lie les rappels au module net pour obtenir des réponses et d'autres événements, y compris les liaisons nécessaires pour obtenir une réponse du serveur.

2) J'utilise stream.write () pour envoyer une requête au serveur.

3) Je ne fais rien alors parce que mon événement «données» lié recevra la réponse du serveur.

Voici où les choses deviennent difficiles. Supposons que j'appelle stream.write () deux fois avant que mon événement "données" lié soit appelé. Maintenant, j'ai un problème. Lorsque l'événement «données» se produit, comment puis-je savoir par quelle réponse il s'agit d'une réponse? Est-ce que je suis garanti que les réponses auront lieu dans le même ordre que les demandes? Et si les réponses reviennent dans un ordre différent?

Tout d'abord, EventEmitter ce qu'est un EventEmitter . JavaScript et donc Node.js sont asynchronous . Cela signifie que, au lieu d'avoir à attendre les connexions entrantes sur un objet serveur, vous ajoutez un listener à l'objet et lui transmettez une callback function , qui est alors "aussi tôt" que l'événement se produit, s'exécute.

On attend encore ici et là-bas en arrière-plan, mais cela a été oublié de vous.

Jetons un coup d'oeil à cet exemple simple:

 // #1) create a new server object, and pass it a function as the callback var server = net.createServer(function (stream) { // #2) register a callback for the 'connect' event stream.on('connect', function () { stream.write('hello\r\n'); // as }); // #3) register a callback for the 'data' event stream.on('data', function (data) { stream.write(data); }); // #4) register a callback for the 'end' event stream.on('end', function () { stream.write('goodbye\r\n'); stream.end(); }); }); // #5) make the server listen on localhost:8124 server.listen(8124, 'localhost'); 

Nous créons ainsi le serveur et lui passons la callback function , cette fonction n'est pas encore exécutée. Passer la fonction ici est essentiellement un raccourci pour ajouter un auditeur pour l'événement de connection de l'objet serveur. Après cela, nous commençons le serveur au #5 .

Maintenant, qu'est-ce qui se passe dans le cas d'une connexion entrante?

  1. Puisque la fonction que nous avons passée à createServer était liée à l'événement de connection , elle est maintenant exécutée.

  2. Il ajoute les auditeurs de connect , de data et de end événement à l' stream object (qui représente la connexion individuelle) en branchant les rappels pour les événements.

  3. Après cela, le stream déclenche l'événement de connect , donc la fonction passée au #2 est exécutée et écrit hello\r\n au flux. Comment la fonction sait-elle à quel flux il devrait écrire? Les fermetures sont la réponse, la fonction hérite de la portée dans laquelle elle a été créée, donc, dans le stream fonctions stream fait toujours référence à la connexion individuelle qui a déclenché ce rappel même dans le présent.

  4. Maintenant, le client envoie des données sur la connexion, ce qui fait appel à l'objet de stream son événement de data , puisque nous associons une fonction à cet événement au #3 nous faisons maintenant écho aux données entrantes vers le client.

  5. Dans le cas où le client ferme la connexion, la fonction que nous avons liée au #4 est appelée, qui écrit goodbye\r\n et après cela ferme la connexion de notre côté.

Est-ce que cela rend les choses un peu plus claires? Eh bien, cela rend tout cela beaucoup plus facile. Le noeud est, tout comme JavaScript est dans les navigateurs, un single threaded . Il n'y a qu'une chose qui se passe à un moment donné.

Pour le décrire simplement, tous ces callbacks se retrouvent dans une file d'attente globale et sont ensuite appelés l'un après l'autre, de sorte que cette file peut (abstraire) ressembler à ceci:

  | connection event for a new stream | data event for stream #12 | callback set via setTimeout v close event of yet another stream 

Ceux-ci sont maintenant exécutés de haut en bas, rien ne se produira entre ceux. Il n'y a aucune chance que, pendant que vous faites quelque chose dans le callback lié à l'événement de data , quelque chose se passera et changera magiquement l'état du système. Même s'il y a une nouvelle connexion entrante sur le serveur, son événement sera mis en file d'attente et il faudra attendre jusqu'à ce que tout ce qui précède, y compris l'événement de data vous êtes actuellement, finit.