Maison  >  Article  >  interface Web  >  Explication détaillée de la méthode d'implémentation du module de communication réseau dans Node.js

Explication détaillée de la méthode d'implémentation du module de communication réseau dans Node.js

巴扎黑
巴扎黑original
2017-08-16 11:54:381542parcourir
Avant-propos
Vraisemblablement, ce que nous utilisons le plus de Node.js est de créer des services http, donc pour tout ingénieur en développement Web, l'apprentissage des modules liés au réseau de Node.js est un must indispensable.
Architecture du module réseau Node.js
Dans le module Node.js, les modules liés au réseau incluent Net, DNS, HTTP, TLS/SSL, HTTPS, UDP/Datagram. De plus, il existe des modules réseau liés à. la couche inférieure de la v8 comprend tcp_wrap.cc, udp_wrap.cc, pipe_wrap.cc, stream_wrap.cc, etc. La couche Javascript et la couche C++ communiquent entre elles via process.binding.
Explication détaillée de la méthode d'implémentation du module de communication réseau dans Node.js

Module Net
Le module Net fournit certaines interfaces de communication réseau sous-jacentes, notamment la création de serveurs et de clients. Le module HTTP est également basé sur le modèle Net. l'encapsulation de couche, dans le module Net, fournit principalement net.Server et net.Socket
Créer un serveur TCP
Créez un serveur TCP, vous pouvez utiliser le constructeur new net.Server ou utiliser l'usine Méthode net.createServer, les deux méthodes renverront une classe net.Server pouvant recevoir deux paramètres facultatifs.
var net = require('net');  var server = net.createServer(function(socket){
  
  socket    .on('data',function(data){
      console.log('socket data',data.toString());
      socket.write( data.toString() );    })    .on('end',function(){
      console.log('socket end')    })    .on('error',function(error){
      console.log('socket error',error);    });});
  server.listen(56200,function(){
  console.log('server run at ',server.address());});
  server.on('error',function(err){  throw err;});// 执行后:server run at { address: '::', family: 'IPv6', port: 56200 }

Si aucun port n'est spécifié lors de l'écoute, il écoutera automatiquement un port à volonté. Après avoir créé un serveur TCP, utilisez tenlent 0.0.0.0 56200, et la communication des données avec le serveur pourra être effectuée après. la connexion. Après avoir instancié un service via createServer, le service écoutera les demandes du client. Après avoir établi un lien avec le client, l'objet net.Socket pour la création de lien sera lancé dans le rappel.
Créer un client TCP
Pour créer un lien client TCP, vous pouvez utiliser le constructeur new net.Socket ou sa méthode d'usine net.createConnection. Après une création réussie, une instance net.Socket sera. est revenu.
var net = require('net');  var client = net.createConnection({port:56200,host:'localhost'});
  client.on('connect',function(){
  console.log('client connect');});
  client.on('data',function(data){
  console.log('client data',toString());});
  client.on('error',function(error){  throw error;});
  client.on('close',function(){
  console.log('client close');});

Socket
Je ne développerai pas ici ce qu'est le socket. Comprenons principalement quelles méthodes et quels événements de surveillance la construction net.Socket fournit principalement.
Événements associés
connexion : déclenché lorsque le client établit avec succès un lien avec le serveur. Si la connexion échoue, le serveur lancera directement un événement d'erreur et quittera le serveur. processus de nœud.
data : Un rappel est déclenché lorsque le client reçoit des données envoyées par le serveur ou lorsque le client envoie des données au serveur.
end : déclenché lorsque l'autre côté envoie un paquet FIN et est déconnecté. Par défaut (allowHalfOpen == false), le socket s'autodétruira (s'il est écrit dans la file d'attente en attente et que le paquet de retour n'a pas reçu de réponse officielle. to), mais nous pouvons définir le paramètre allowHalfOpen sur true, afin que vous puissiez continuer à écrire des données sur le socket, mais nous devons appeler la méthode end nous-mêmes pour consommer le socket, sinon cela pourrait provoquer une fuite de handle.
close : Déclenché lorsque le lien est déconnecté, mais s'il y a une erreur pendant le processus de transmission, une erreur sera renvoyée dans la fonction de rappel.
timeout : déclenché lorsque le socket expire et est inactif. Si vous souhaitez le détruire dans la file d'attente, vous devez appeler manuellement la méthode close.
recherche : déclenchée lorsque la résolution du nom de domaine est terminée.
drain : Déclenché lorsque le cache est écrit et peut être utilisé pour limiter la taille du téléchargement.
Méthodes associées
write() : Le serveur envoie des données au client ou le client envoie des données au serveur.
address() : Obtenez l'adresse IP du socket lié au service. L'objet renvoyé a trois attributs, à savoir le port, l'hôte,
et la version IPvX.
end() : fermez à moitié le socket et un paquet FIN sera envoyé. Le serveur peut toujours envoyer des données. Vous pouvez également appeler socket.end(data,encoding) comme ceci.
pause() : met en pause la lecture des données et peut être utilisé pour limiter le téléchargement de données.
resume() : Continuer la lecture des données.
setEncoding() : Définit le format d'acquisition du flux de données.
setKeepAlive() : Autoriser/désactiver la fonction keep-alive.
setNoDelay() : Désactivez l'algorithme Nagele. Les liens TCP utilisent l'algorithme Nagle par défaut, et leurs données seront mises en cache avant l'envoi. Si cela est vrai, les données seront envoyées immédiatement à chaque fois que socket.write() est appelée. La valeur par défaut est true.
setTimeout() : Lorsqu'un socket inactif est inactif pendant un certain nombre de secondes, il recevra un événement de délai d'attente, mais le socket ne cessera pas d'être détruit, et end() ou destroy() doit être appelé manuellement. Indique que le délai d'inactivité est interdit.
Attributs associés
bufferSize : le nombre de chaînes actuellement mises en cache en attente d'envoi.
bytesRead : Nombre d'octets reçus.
bytesWritten : Le nombre d'octets envoyés
destroyed : Identifie si le lien a été détruit. Une fois détruit, le lien n'a pas besoin d'être utilisé pour transmettre des données.
localAddress : L'hôte auquel le client distant se connecte à l'adresse locale. Si l'hôte de notre service d'écoute est 0.0.0.0 et que la connexion client est « 192.168.1.1 », la valeur finale est cette dernière.
localPort : port local.
remoteAddress : IP du client, si le socket est détruit, la valeur est indéfinie.
remoteFamily : Le client est IPvX
Traitement des exceptions de retour de paquets
Le serveur entre dans le lien de traitement après avoir reçu les données qui doivent être traitées du client si le socket est interrompu auparavant. le traitement de la logique métier est terminé. S'il est activé, lorsque le serveur fera rapport au client, il répondra directement à l'événement d'erreur et signalera l'erreur : ce socket a été terminé par l'autre partie. Par conséquent, avant de répondre, le serveur doit d'abord déterminer si le socket a été détruit. S'il n'a pas été détruit, puis renvoyer le paquet et le détruire s'il a été déconnecté :
var net = require('net');var biz = require('./biz');var server = net.createServer(function(socket){
  
  socket    .on('data',function(data){
      biz.do(data)        .then(function(){          if( !socket.destroyed ) {
            socket.write( data.toString() );          } else {            // do some report
            socket.destry();          }        })        .catch(function(){          !socket.destroyed && socket.end('server handler error');        });        
    })    .on('end',function(){
      console.log('socket end')    })    .on('error',function(error){
      console.log('socket error',error);    });});
  server.listen(56200,function(){
  console.log('server run at ',server.address());});server.on('error',function(err){  throw err;});

Limiter la taille des données client.
对请求大小限制是服务安全里面比不可少的一个环节,服务端不能无限大小的去接受客户端发送过来的所有数据,而限制大小就是第一道门槛。
var net = require('net');var MAX_REQUEST_BYTES = 2 * 1024 * 1024; // 2Mvar server = net.createServer(function(socket){
  
  socket    .on('data',function(data){        
      if(data.bytesRead > MAX_REQUEST_BYTES) {
        socket.pause();
        socket.end('data is too big, forbidden');        // do some report      }    })    .on('end',function(){
      console.log('socket end')    })    .on('error',function(error){
      console.log('socket error',error);    });});
  server.listen(56200,function(){
  console.log('server run at ',server.address());});
  server.on('error',function(err){  throw err;});

Ce qui précède est le contenu détaillé de. pour plus d'informations, suivez d'autres articles connexes sur le site Web de PHP en chinois!

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn