Heim  >  Artikel  >  Web-Frontend  >  Detaillierte Erläuterung der Implementierungsmethode des Netzwerkkommunikationsmoduls in Node.js

Detaillierte Erläuterung der Implementierungsmethode des Netzwerkkommunikationsmoduls in Node.js

巴扎黑
巴扎黑Original
2017-08-16 11:54:381592Durchsuche
Vorwort
Vermutlich verwenden wir Node.js am häufigsten zum Erstellen von HTTP-Diensten. Daher ist das Erlernen der netzwerkbezogenen Module von Node.js für jeden Webentwicklungsingenieur ein Muss.
Node.js-Netzwerkmodularchitektur
Im Node.js-Modul umfassen die netzwerkbezogenen Module Net, DNS, HTTP, TLS/SSL, HTTPS, UDP/Datagram. Darüber hinaus gibt es die zugehörigen Netzwerkmodule Die unterste Ebene von Version 8 umfasst tcp_wrap.cc, udp_wrap.cc, pipe_wrap.cc, stream_wrap.cc usw. Die Javascript-Ebene und die C++-Ebene kommunizieren über process.binding miteinander.
Detaillierte Erläuterung der Implementierungsmethode des Netzwerkkommunikationsmoduls in Node.js

Net-Modul
Das Net-Modul stellt einige zugrunde liegende Netzwerkkommunikationsschnittstellen bereit, einschließlich der Erstellung von Servern und Clients. Das HTTP-Modul basiert ebenfalls auf dem Net-Modell Die Schichtkapselung im Net-Modul stellt hauptsächlich net.Server und net.Socket bereit.
TCP-Server erstellen
Erstellen Sie einen TCP-Server. Sie können den Konstruktor new net.Server oder die Factory verwenden Methode net.createServer, beide Methoden geben eine net.Server-Klasse zurück, die zwei optionale Parameter empfangen kann.
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 }

Wenn beim Abhören kein Port angegeben wird, wird nach dem Erstellen eines TCP-Servers automatisch Tenlent 0.0.0.0 56200 verwendet, und die Datenkommunikation mit dem Server kann anschließend durchgeführt werden die Verbindung. Nach der Instanziierung eines Dienstes über createServer hört der Dienst auf Clientanforderungen. Nach dem Herstellen einer Verbindung mit dem Client wird das net.Socket-Objekt für den Linkaufbau im Rückruf geworfen.
TCP-Client erstellen
Um einen TCP-Client-Link zu erstellen, können Sie den Konstruktor new net.Socket oder seine Factory-Methode net.createConnection verwenden. Nach erfolgreicher Erstellung wird eine net.Socket-Instanz erstellt zurückgegeben.
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
Ich werde hier nicht näher darauf eingehen, welche Methoden und Überwachungsereignisse das net.Socket-Konstrukt hauptsächlich bietet.
Verwandte Ereignisse
connect: Wird ausgelöst, wenn der Client erfolgreich eine Verbindung mit dem Server herstellt. Wenn die Verbindung fehlschlägt, löst der Server direkt ein Fehlerereignis aus und beendet den Knotenprozess.
Daten: Ein Rückruf wird ausgelöst, wenn der Client vom Server gesendete Daten empfängt oder wenn der Client Daten an den Server sendet.
Ende: Wird ausgelöst, wenn die andere Seite ein FIN-Paket sendet und die Verbindung getrennt wird. Standardmäßig (allowHalfOpen == false) zerstört sich der Socket selbst (wenn er in die ausstehende Warteschlange geschrieben wird und das Rückpaket nicht offiziell beantwortet wurde). zu), aber wir können den Parameter „allowHalfOpen“ auf „true“ setzen, sodass Sie weiterhin Daten in den Socket schreiben können. Wir müssen jedoch die Endmethode selbst aufrufen, um den Socket zu verbrauchen, da es sonst zu Handle-Lecks kommen kann.
Schließen: Wird ausgelöst, wenn die Verbindung getrennt wird. Wenn jedoch während des Übertragungsprozesses ein Fehler auftritt, wird ein Fehler in der Rückruffunktion ausgegeben.
Timeout: Wird ausgelöst, wenn der Socket eine Zeitüberschreitung aufweist und inaktiv ist. Wenn Sie ihn in der Warteschlange zerstören möchten, müssen Sie die Close-Methode manuell aufrufen.
Suche: Wird ausgelöst, wenn die Auflösung des Domänennamens abgeschlossen ist.
Drain: Wird beim Schreiben des Caches ausgelöst und kann zur Begrenzung der Upload-Größe verwendet werden.
Verwandte Methoden
write(): Der Server sendet Daten an den Client oder der Client sendet Daten an den Server.
address(): Ruft die IP-Adresse des an den Dienst gebundenen Sockets ab. Das zurückgegebene Objekt verfügt über drei Attribute, nämlich Port, Host,
und IPvX-Version.
end(): Schließen Sie den Socket halb und der Server sendet möglicherweise noch einige Daten. Sie können socket.end(data,encoding) auch so aufrufen.
pause(): Pausiert das Lesen von Daten und kann verwendet werden, um das Hochladen von Daten einzuschränken.
resume(): Datenlesen fortsetzen.
setEncoding(): Legt das Erfassungsformat des Datenstroms fest.
setKeepAlive(): Keep-Alive-Funktion zulassen/deaktivieren.
setNoDelay(): Deaktivieren Sie den Nagele-Algorithmus. TCP-Links verwenden standardmäßig den Nagle-Algorithmus und ihre Daten werden vor dem Senden zwischengespeichert. Wenn dies wahr ist, werden die Daten bei jedem Aufruf von socket.write() sofort gesendet. Der Standardwert ist wahr.
setTimeout(): Wenn ein inaktiver Socket mehrere Sekunden lang inaktiv ist, erhält er ein Timeout-Ereignis, die Zerstörung des Sockets wird jedoch nicht gestoppt und end() oder destroy() muss manuell aufgerufen werden. Zeigt an, dass eine Leerlaufzeitüberschreitung verboten ist.
Zugehörige Attribute
bufferSize: Die Anzahl der derzeit zwischengespeicherten Zeichenfolgen, die darauf warten, gesendet zu werden.
bytesRead: Anzahl der empfangenen Bytes.
bytesWritten: Die Anzahl der gesendeten Bytes
zerstört: Gibt an, ob der Link zerstört wurde. Sobald er zerstört ist, muss der Link nicht mehr zur Datenübertragung verwendet werden.
localAddress: Der Host, mit dem sich der Remote-Client mit der lokalen Adresse verbindet. Wenn der Host unseres Abhördienstes 0.0.0.0 ist und die Clientverbindung „192.168.1.1“ ist, ist der Endwert letzterer.
localPort: lokaler Port.
remoteAddress: Client-IP, wenn der Socket zerstört wird, ist der Wert undefiniert.
remoteFamily: Der Client ist IPvX
Paketrückgabe-Ausnahmebehandlung
Der Server tritt in den Verarbeitungslink ein, nachdem er die zu verarbeitenden Daten vom Client empfangen hat, wenn der Socket zuvor unterbrochen wurde Die Verarbeitung der Geschäftslogik ist abgeschlossen. Wenn sie aktiviert ist, reagiert der Server direkt auf das Fehlerereignis und meldet Fehler: Dieser Socket wurde vom anderen Teil beendet Der Server muss zunächst feststellen, ob der Socket zerstört wurde. Anschließend wird das Paket zurückgegeben und zerstört, wenn die Verbindung unterbrochen wurde:
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;});

Client-Datengröße begrenzen
对请求大小限制是服务安全里面比不可少的一个环节,服务端不能无限大小的去接受客户端发送过来的所有数据,而限制大小就是第一道门槛。
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;});

Das obige ist der detaillierte Inhalt vonDetaillierte Erläuterung der Implementierungsmethode des Netzwerkkommunikationsmoduls in Node.js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn