Node.js net-Modul

Java FileIntegrierte Module in Node.js


von Node.jsnetDas Modul ist ein Kernmodul, das verwendet wird, um Server und Clients basierend auf TCP oder IPC zu erstellen. Es bietet asynchrone Netzwerkprogrammierungsfähigkeiten und kann verwendet werden, um verschiedene Netzwerkanwendungen zu erstellen, wie Chat-Server, Proxy-Server usw.

Hauptfunktionen

  1. TCP-Server und -Clients erstellen
  2. IPC-Server und -Clients (Interprozesskommunikation) erstellen
  3. Netzwerkverbindungen und Datenübertragung handhaben
  4. Den Lebenszyklus von Netzwerkverbindungen verwalten

Grundlegende Verwendung

Einen TCP-Server erstellen

Beispiel

const net = require('net');

// Einen TCP-Server erstellen
const server = net.createServer((socket) => {
  console.log('Client verbunden');
 
  // Daten vom Client empfangen
  socket.on('data', (data) => {
    console.log(`Empfangene Daten: ${data}`);
    socket.write(`Server empfangen: ${data}`); // Daten an den Client senden
  });
 
  // Client getrennt
  socket.on('end', () => {
    console.log('Client getrennt');
  });
});

// Auf Port 3000 lauschen
server.listen(3000, () => {
  console.log('Server lauscht auf Port 3000');
});

TCP-Client erstellen

Beispiel

const net = require('net');

// Client erstellen und mit dem Server verbinden
const client = net.createConnection({ port: 3000 }, () => {
  console.log('Mit Server verbunden');
  client.write('Hallo Server!'); // Daten an den Server senden
});

// Daten vom Server empfangen
client.on('data', (data) => {
  console.log(`Empfangene Serverdaten: ${data}`);
  client.end(); // Verbindung trennen
});

client.on('end', () => {
  console.log('Vom Server getrennt');
});

Details zur Kern-API

net.createServer([options][, connectionListener])

Erstellt einen neuen TCP- oder IPC-Server.

Parameter:

  • options: Optionales Konfigurationsobjekt
    • allowHalfOpen: Gibt an, ob halboffene Verbindungen zugelassen werden, Standardwert ist false
    • pauseOnConnect: Gibt an, ob der Socket bei Verbindung pausiert wird, Standardwert ist false
  • connectionListener: Wird automatisch als Listener für das Ereignis 'connection' festgelegt

net.createConnection(options[, connectListener])

Erstellt eine TCP-Verbindung zum angegebenen Port und Host.

Gängige Optionen:

  • port: Der Port, zu dem eine Verbindung hergestellt werden soll (erforderlich)
  • host: Der Host, zu dem eine Verbindung hergestellt werden soll, Standardwert ist 'localhost'
  • localAddress: Die lokale Schnittstelle, die zum Binden der Netzwerkverbindung verwendet wird
  • family: IP-Protokollfamilie (4 oder 6)

Netzwerk-Socket (Socket)

net.SocketEs ist die Kernklasse des net-Moduls und repräsentiert eine Netzwerkverbindung.

Häufige Ereignisse

  1. connect: Wird ausgelöst, wenn eine Verbindung erfolgreich hergestellt wird
  2. data: Wird ausgelöst, wenn Daten empfangen werden
  3. end: Wird ausgelöst, wenn das andere Ende der Verbindung ein FIN-Paket sendet
  4. timeout: Wird ausgelöst, wenn bei der Verbindung aufgrund von Inaktivität ein Timeout auftritt
  5. error: Wird ausgelöst, wenn ein Fehler auftritt
  6. close: Wird ausgelöst, wenn der Socket vollständig geschlossen ist

Häufige Methoden

  1. write(data[, encoding][, callback]): Daten über den Socket senden
  2. end([data][, encoding]): Den Socket halbseitig schließen
  3. destroy(): Sicherstellen, dass keine weitere I/O-Aktivität auf diesem Socket stattfindet
  4. pause(): Lesen von Daten pausieren
  5. resume(): Lesen von Daten fortsetzen

Erweiterte Anwendungen

Umgang mit mehreren Client-Verbindungen

Beispiel

const net = require('net');

const server = net.createServer((socket) => {
  // Eine eindeutige ID für jede Verbindung festlegen
  socket.id = Date.now();
 
  console.log(`Client ${socket.id}verbunden`);
 
  socket.on('data', (data) => {
    console.log(`Von Client ${socket.id}empfangene Daten: ${data}`);
    // Eine Nachricht an alle Clients senden
    server.getConnections((err, count) => {
      if (count > 1) {
        socket.write(`Es sind ${count-1}weitere Clients online`);
      }
    });
  });
 
  socket.on('end', () => {
    console.log(`Client ${socket.id}getrennt`);
  });
});

server.listen(3000);

Timeout-Behandlung

Beispiel

const server = net.createServer((socket) => {
  // Verbindungs-Timeout auf 5 Minuten setzen
  socket.setTimeout(5 * 60 * 1000);
 
  socket.on('timeout', () => {
    console.log('Verbindungs-Timeout, Verbindung wird getrennt');
    socket.end();
  });
});

Methoden und Eigenschaften

FunktionBeschreibung
Server erstellennet.createServer([options][, connectionListener]): Wird verwendet, um einen TCP-Server zu erstellen, kann auf Verbindungsanfragen lauschen.
Mit Server verbindennet.connect(options[, connectListener])odernet.createConnection(options[, connectListener]): Wird verwendet, um eine Verbindung zu einem angegebenen Server herzustellen (einen Client zu erstellen).
Socket-ObjektsocketDas Objekt repräsentiert eine Verbindung zu einem TCP-Server oder -Client und enthält verschiedene Methoden zum Senden, Empfangen und Schließen von Verbindungen.

Methoden

Nein.Methoden & Beschreibung
1net.createServer([options][, connectionListener])
Erstellt einen TCP-Server. Der Parameter connectionListener erstellt automatisch einen Listener für das 'connection'-Ereignis.
2net.connect(options[, connectionListener])
Gibt ein neues 'net.Socket' zurück und stellt eine Verbindung zur angegebenen Adresse und zum angegebenen Port her.
Wenn der Socket hergestellt ist, wird das 'connect'-Ereignis ausgelöst.
3net.createConnection(options[, connectionListener])
Erstellt eine TCP-Verbindung zu Port port und Host host. host ist standardmäßig 'localhost'.
4net.connect(port[, host][, connectListener])
Erstellt eine TCP-Verbindung mit Port port und Host host. host ist standardmäßig 'localhost'. Der Parameter connectListener wird als Listener für das 'connect'-Ereignis hinzugefügt. Gibt 'net.Socket' zurück.
5net.createConnection(port[, host][, connectListener])
Erstellt eine TCP-Verbindung mit Port port und Host host. host ist standardmäßig 'localhost'. Der Parameter connectListener wird als Listener für das 'connect'-Ereignis hinzugefügt. Gibt 'net.Socket' zurück.
6net.connect(path[, connectListener])
Erstellt einen Unix-Socket, der mit path verbunden ist. Der Parameter connectListener wird als Listener für das 'connect'-Ereignis hinzugefügt. Gibt 'net.Socket' zurück.
7net.createConnection(path[, connectListener])
Erstellt einen Unix-Socket, der mit path verbunden ist. Der Parameter connectListener wird als Listener für das 'connect'-Ereignis hinzugefügt. Gibt 'net.Socket' zurück.
8net.isIP(input)
Prüft, ob die Eingabe eine IP-Adresse ist. Gibt 4 für IPV4, 6 für IPV6 und ansonsten 0 zurück.
9net.isIPv4(input)
Wenn die Eingabeadresse IPV4 ist, wird true zurückgegeben, andernfalls false.
10net.isIPv6(input)
Wenn die Eingabeadresse IPV6 ist, wird true zurückgegeben, andernfalls false.

net.Server

net.Server wird normalerweise verwendet, um einen TCP- oder lokalen Server zu erstellen.

Nein.Methoden & Beschreibung
1server.listen(port[, host][, backlog][, callback])
Lauscht auf Verbindungen an dem angegebenen Port port und Host host. Standardmäßig akzeptiert host direkte Verbindungen von jeder IPv4-Adresse (INADDR_ANY). Wenn port 0 ist, wird ein zufälliger Port zugewiesen.
2server.listen(path[, callback])
Startet einen lokalen Socket-Server, indem auf dem angegebenen Pfad gelauscht wird.
3server.listen(handle[, callback])
Stellt über den angegebenen Handle eine Verbindung her.
4server.listen(options[, callback])
Die Eigenschaften von options: port, host und backlog sowie die optionale Callback-Funktion rufen zusammen server.listen(port, [host], [backlog], [callback]) auf. Außerdem kann der Parameter path verwendet werden, um einen UNIX-Socket anzugeben.
5server.close([callback])
Der Server akzeptiert keine neuen Verbindungen mehr und hält bestehende Verbindungen aufrecht. Dies ist eine asynchrone Funktion. Wenn alle Verbindungen enden, wird der Server geschlossen und das Ereignis 'close' wird ausgelöst.
6server.address()
Das Betriebssystem gibt die gebundene Adresse, den Namen der Protokollfamilie und den Serverport zurück.
7server.unref()
Wenn dies der einzige aktive Server im Ereignissystem ist, ermöglicht der Aufruf von unref das Beenden des Programms.
8server.ref()
Gegenteil von unref. Wenn dies der einzige Server ist, verhindert der Aufruf von ref auf einem Server, der zuvor unref'd wurde, dass das Programm beendet wird (Standardverhalten). Wenn der Server bereits ref'd wurde, hat ein erneuter Aufruf von ref keine Auswirkung.
9server.getConnections(callback)
Ruft asynchron die Anzahl der aktuell aktiven Verbindungen auf dem Server ab. Dies ist erst gültig, nachdem der Socket an den Child-Prozess gesendet wurde; die Callback-Funktion hat 2 Parameter, err und count.

Ereignisse

Nein.Ereignis & Beschreibung
1listening
Wird ausgelöst, wenn der Server server.listen aufruft, um zu binden.
2Verbindung
Wird ausgelöst, wenn eine neue Verbindung erstellt wird. socket ist eine Instanz von net.Socket.
3close
Wird ausgelöst, wenn der Server geschlossen wird. Hinweis: Wenn Verbindungen bestehen, wird dieses Ereignis erst ausgelöst, wenn alle Verbindungen geschlossen sind.
4error
Wird ausgelöst, wenn ein Fehler auftritt. Das 'close'-Ereignis wird direkt von den folgenden Ereignissen aufgerufen.

net.Socket

Das net.Socket-Objekt ist eine Abstraktion eines TCP- oder UNIX-Sockets. net.Socket-Instanzen implementieren eine Duplex-Stream-Schnittstelle. Sie können verwendet werden, wenn der Benutzer einen Client erstellt (mit connect()), oder sie können von Node erstellt und dem Benutzer über das connection-Ereignis des Servers übergeben werden.

Ereignisse

Zu den net.Socket-Ereignissen gehören:

Nein.Ereignis & Beschreibung
1lookup
Wird ausgelöst, nachdem der Domänenname aufgelöst wurde, aber bevor die Verbindung hergestellt wird. Nicht anwendbar auf UNIX-Sockets.
2connect
Wird ausgelöst, wenn eine Socket-Verbindung erfolgreich hergestellt wurde.
3data
Wird ausgelöst, wenn Daten empfangen werden.
4end
Wird ausgelöst, wenn das andere Ende des Sockets ein FIN-Paket sendet.
5timeout
Wird ausgelöst, wenn beim Socket aufgrund von Inaktivität ein Timeout auftritt. Dies zeigt nur an, dass der Socket inaktiv geworden ist. Der Benutzer muss die Verbindung manuell schließen.
6drain
Wird ausgelöst, wenn der Schreibpuffer leer wird. Kann verwendet werden, um Uploads zu steuern.
7error
Wird ausgelöst, wenn ein Fehler auftritt.
8close
Wird ausgelöst, wenn der Socket vollständig geschlossen wurde. Der Parameter had_error ist ein boolescher Wert, der angibt, ob der Socket aufgrund eines Übertragungsfehlers geschlossen wurde.

Eigenschaften

net.Socket bietet viele nützliche Eigenschaften zur Steuerung der Socket-Interaktion:

Nein.Eigenschaft & Beschreibung
1socket.bufferSize
Diese Eigenschaft zeigt die Anzahl der Bytes an, die in den Puffer geschrieben werden sollen.
2socket.remoteAddress
Die Remote-IP-Adresse als Zeichenkette, z. B. '74.125.127.100' oder '2001:4860:a005::68'.
3socket.remoteFamily
Die Zeichenkette der Remote-IP-Protokollfamilie, z. B. 'IPv4' oder 'IPv6'.
4socket.remotePort
Der Remote-Port, dargestellt als Zahl, z. B. 80 oder 21.
5socket.localAddress
Die lokale Schnittstelle, die an die Netzwerkverbindung gebunden ist. Die lokale IP-Adresse, mit der sich der Remote-Client verbindet, als Zeichenkette. Wenn Sie beispielsweise auf '0.0.0.0' lauschen und der Client sich mit '192.168.1.1' verbindet, ist der Wert '192.168.1.1'.
6socket.localPort
Die lokale Portadresse, dargestellt als Zahl. Zum Beispiel: 80 oder 21.
7socket.bytesRead
Die Anzahl der empfangenen Bytes.
8socket.bytesWritten
Die Anzahl der gesendeten Bytes.

Methoden

Nein.Methode & Beschreibung
1new net.Socket([options])
Erzeugt ein neues Socket-Objekt.
2socket.connect(port[, host][, connectListener])
Erstellt eine Socket-Verbindung mit dem angegebenen Port und Host. Der Parameter host ist standardmäßig localhost. Normalerweise ist es nicht erforderlich, net.createConnection zu verwenden, um einen Socket zu öffnen. Es wird nur verwendet, wenn Sie Ihren eigenen Socket implementieren.
3socket.connect(path[, connectListener])
Öffnet einen Unix-Socket unter dem angegebenen Pfad. Normalerweise ist es nicht erforderlich, net.createConnection zu verwenden, um einen Socket zu öffnen. Es wird nur verwendet, wenn Sie Ihren eigenen Socket implementieren.
4socket.setEncoding([encoding])
Legt die Kodierung fest.
5socket.write(data[, encoding][, callback])
Sendet Daten über den Socket. Der zweite Parameter gibt die Kodierung der Zeichenkette an, die standardmäßig UTF8-Kodierung ist.
6socket.end([data][, encoding])
Schließt den Socket halbseitig. Zum Beispiel sendet es ein FIN-Paket. Der Server sendet möglicherweise noch Daten.
7socket.destroy()
Stellt sicher, dass auf diesem Socket keine I/O-Aktivität stattfindet. Nur im Fehlerfall erforderlich. (um Fehler zu behandeln usw.)
8socket.pause()
Pausiert das Lesen von Daten. Das heißt, das data-Ereignis wird nicht mehr ausgelöst. Sehr nützlich zum Steuern von Uploads.
9socket.resume()
Setzt das Lesen von Daten nach dem Aufruf von pause() fort.
10socket.setTimeout(timeout[, callback])
Versetzt den Socket nach mehr als timeout Millisekunden Inaktivität in einen Timeout.
11socket.setNoDelay([noDelay])
Deaktiviert den Nagle-Algorithmus. Standardmäßig verwenden TCP-Verbindungen den Nagle-Algorithmus, der Daten vor dem Senden puffert. Wenn noDelay auf true gesetzt wird, werden Daten sofort beim Aufruf von socket.write() gesendet. Der Standardwert von noDelay ist true.
12socket.setKeepAlive([enable][, initialDelay])
Deaktiviert/aktiviert die Keep-Alive-Funktionalität und legt optional eine Anfangsverzögerung fest, bevor die erste Keep-Alive-Sonde auf einem inaktiven Socket gesendet wird. Standard ist false. Legen Sie initialDelay (in Millisekunden) fest, um die Verzögerung zwischen dem letzten empfangenen Paket und der ersten Keep-Alive-Sonde festzulegen. Wenn initialDelay auf 0 gesetzt wird, bleibt der Standardwert (oder der vorherige Wert) erhalten. Der Standardwert ist 0.
13socket.address()
Gibt die gebundene Adresse, den Namen der Protokollfamilie und den Serverport zurück, wie vom Betriebssystem gemeldet. Das zurückgegebene Objekt hat 3 Eigenschaften, z. B. { port: 12346, family: 'IPv4', address: '127.0.0.1' }.
14socket.unref()
Wenn dies der einzige aktive Server im Ereignissystem ist, ermöglicht der Aufruf von unref dem Programm das Beenden. Wenn der Server bereits unrefed wurde, hat ein erneuter Aufruf von unref keine Auswirkung.
15socket.ref()
Gegenteil von unref. Wenn dies der einzige Server ist, lässt ein Aufruf von ref auf einem Server, der zuvor unrefed wurde, das Programm nicht beenden (Standardverhalten). Wenn der Server bereits refed wurde, hat ein erneuter Aufruf von ref keine Auswirkung.

Beispiel

Erstellen Sie eine Datei server.js mit dem folgenden Code:

Beispiel

var net = require('net');
var server = net.createServer(function(connection) {
   console.log('client connected');
   connection.on('end', function() {
      console.log('Client closed the connection');
   });
   connection.write('Hello World!\r\n');
   connection.pipe(connection);
});
server.listen(8080, function() {
  console.log('server is listening');
});

Führen Sie den obigen Servercode aus:

$ node server.js
server is listening   # 服务已创建并监听 8080 端口

Öffnen Sie ein neues Fenster und erstellen Sie eine client.js-Datei mit dem folgenden Code:

Beispiel

var net = require('net');
var client = net.connect({port: 8080}, function() {
   console.log('Connected to server!');  
});
client.on('data', function(data) {
   console.log(data.toString());
   client.end();
});
client.on('end', function() {
   console.log('Vom Server getrennt');
});

Führen Sie den obigen Client-Code aus:

连接到服务器!
Hello World!

断开与服务器的连接

GIF-Beispieldemonstration


Praktische Anwendungsszenarien

  1. Chat-Anwendung: Einen Echtzeit-Chat-Server erstellen
  2. Spielserver: Echtzeit-Multiplayer-Interaktion verarbeiten
  3. Proxy-Server: Client-Anfragen weiterleiten
  4. Benutzerdefiniertes Protokoll: Spezifische Anwendungsschicht-Protokolle implementieren
  5. IoT-Gerätekommunikation: Mit eingebetteten Geräten kommunizieren

Best Practices

  1. Fehlerbehandlung: Immer auf das 'error'-Ereignis lauschen
  2. Ressourcenverwaltung: Nicht mehr verwendete Verbindungen rechtzeitig schließen
  3. Leistungsüberlegungen: Bei Szenarien mit hoher Nebenläufigkeit die Verwendung eines Verbindungspools in Betracht ziehen
  4. Sicherheit: Implementieren Sie geeignete Authentifizierungs- und Verschlüsselungsmechanismen
  5. Protokollierung: Aufzeichnung wichtiger Verbindungsereignisse und Daten

Beispiel

// Beispiel: Vollständige Fehlerbehandlung
server.on('error', (err) => {
  console.error('Server error:', err);
});

client.on('error', (err) => {
  console.error('Client error:', err);
});

Durch die Beherrschung des net-Moduls können Sie eine Vielzahl leistungsstarker Netzwerkanwendungen erstellen, die zugrunde liegenden Prinzipien der Netzwerkkommunikation verstehen und ein solides Fundament für das Erlernen fortgeschrittenerer Netzwerk-Frameworks legen.

Java FileNode.js integrierte Module

Weitere Erweiterungen