Node.js net-Modul
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
- TCP-Server und -Clients erstellen
- IPC-Server und -Clients (Interprozesskommunikation) erstellen
- Netzwerkverbindungen und Datenübertragung handhaben
- Den Lebenszyklus von Netzwerkverbindungen verwalten
Grundlegende Verwendung
Einen TCP-Server erstellen
Beispiel
// 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
// 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 KonfigurationsobjektallowHalfOpen: Gibt an, ob halboffene Verbindungen zugelassen werden, Standardwert ist falsepauseOnConnect: 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 wirdfamily: IP-Protokollfamilie (4 oder 6)
Netzwerk-Socket (Socket)
net.SocketEs ist die Kernklasse des net-Moduls und repräsentiert eine Netzwerkverbindung.
Häufige Ereignisse
connect: Wird ausgelöst, wenn eine Verbindung erfolgreich hergestellt wirddata: Wird ausgelöst, wenn Daten empfangen werdenend: Wird ausgelöst, wenn das andere Ende der Verbindung ein FIN-Paket sendettimeout: Wird ausgelöst, wenn bei der Verbindung aufgrund von Inaktivität ein Timeout auftritterror: Wird ausgelöst, wenn ein Fehler auftrittclose: Wird ausgelöst, wenn der Socket vollständig geschlossen ist
Häufige Methoden
write(data[, encoding][, callback]): Daten über den Socket sendenend([data][, encoding]): Den Socket halbseitig schließendestroy(): Sicherstellen, dass keine weitere I/O-Aktivität auf diesem Socket stattfindetpause(): Lesen von Daten pausierenresume(): Lesen von Daten fortsetzen
Erweiterte Anwendungen
Umgang mit mehreren Client-Verbindungen
Beispiel
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
// 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
| Funktion | Beschreibung |
|---|---|
| Server erstellen | net.createServer([options][, connectionListener]): Wird verwendet, um einen TCP-Server zu erstellen, kann auf Verbindungsanfragen lauschen. |
| Mit Server verbinden | net.connect(options[, connectListener])odernet.createConnection(options[, connectListener]): Wird verwendet, um eine Verbindung zu einem angegebenen Server herzustellen (einen Client zu erstellen). |
| Socket-Objekt | socketDas 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 |
|---|---|
| 1 | net.createServer([options][, connectionListener]) Erstellt einen TCP-Server. Der Parameter connectionListener erstellt automatisch einen Listener für das 'connection'-Ereignis. |
| 2 | net.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. |
| 3 | net.createConnection(options[, connectionListener]) Erstellt eine TCP-Verbindung zu Port port und Host host. host ist standardmäßig 'localhost'. |
| 4 | net.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. |
| 5 | net.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. |
| 6 | net.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. |
| 7 | net.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. |
| 8 | net.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. |
| 9 | net.isIPv4(input) Wenn die Eingabeadresse IPV4 ist, wird true zurückgegeben, andernfalls false. |
| 10 | net.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 |
|---|---|
| 1 | server.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. |
| 2 | server.listen(path[, callback]) Startet einen lokalen Socket-Server, indem auf dem angegebenen Pfad gelauscht wird. |
| 3 | server.listen(handle[, callback]) Stellt über den angegebenen Handle eine Verbindung her. |
| 4 | server.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. |
| 5 | server.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. |
| 6 | server.address() Das Betriebssystem gibt die gebundene Adresse, den Namen der Protokollfamilie und den Serverport zurück. |
| 7 | server.unref() Wenn dies der einzige aktive Server im Ereignissystem ist, ermöglicht der Aufruf von unref das Beenden des Programms. |
| 8 | server.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. |
| 9 | server.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 |
|---|---|
| 1 | listening Wird ausgelöst, wenn der Server server.listen aufruft, um zu binden. |
| 2 | Verbindung Wird ausgelöst, wenn eine neue Verbindung erstellt wird. socket ist eine Instanz von net.Socket. |
| 3 | close Wird ausgelöst, wenn der Server geschlossen wird. Hinweis: Wenn Verbindungen bestehen, wird dieses Ereignis erst ausgelöst, wenn alle Verbindungen geschlossen sind. |
| 4 | error 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 |
|---|---|
| 1 | lookup Wird ausgelöst, nachdem der Domänenname aufgelöst wurde, aber bevor die Verbindung hergestellt wird. Nicht anwendbar auf UNIX-Sockets. |
| 2 | connect Wird ausgelöst, wenn eine Socket-Verbindung erfolgreich hergestellt wurde. |
| 3 | data Wird ausgelöst, wenn Daten empfangen werden. |
| 4 | end Wird ausgelöst, wenn das andere Ende des Sockets ein FIN-Paket sendet. |
| 5 | timeout 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. |
| 6 | drain Wird ausgelöst, wenn der Schreibpuffer leer wird. Kann verwendet werden, um Uploads zu steuern. |
| 7 | error Wird ausgelöst, wenn ein Fehler auftritt. |
| 8 | close 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 |
|---|---|
| 1 | socket.bufferSize Diese Eigenschaft zeigt die Anzahl der Bytes an, die in den Puffer geschrieben werden sollen. |
| 2 | socket.remoteAddress Die Remote-IP-Adresse als Zeichenkette, z. B. '74.125.127.100' oder '2001:4860:a005::68'. |
| 3 | socket.remoteFamily Die Zeichenkette der Remote-IP-Protokollfamilie, z. B. 'IPv4' oder 'IPv6'. |
| 4 | socket.remotePort Der Remote-Port, dargestellt als Zahl, z. B. 80 oder 21. |
| 5 | socket.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'. |
| 6 | socket.localPort Die lokale Portadresse, dargestellt als Zahl. Zum Beispiel: 80 oder 21. |
| 7 | socket.bytesRead Die Anzahl der empfangenen Bytes. |
| 8 | socket.bytesWritten Die Anzahl der gesendeten Bytes. |
Methoden
| Nein. | Methode & Beschreibung |
|---|---|
| 1 | new net.Socket([options]) Erzeugt ein neues Socket-Objekt. |
| 2 | socket.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. |
| 3 | socket.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. |
| 4 | socket.setEncoding([encoding]) Legt die Kodierung fest. |
| 5 | socket.write(data[, encoding][, callback]) Sendet Daten über den Socket. Der zweite Parameter gibt die Kodierung der Zeichenkette an, die standardmäßig UTF8-Kodierung ist. |
| 6 | socket.end([data][, encoding]) Schließt den Socket halbseitig. Zum Beispiel sendet es ein FIN-Paket. Der Server sendet möglicherweise noch Daten. |
| 7 | socket.destroy() Stellt sicher, dass auf diesem Socket keine I/O-Aktivität stattfindet. Nur im Fehlerfall erforderlich. (um Fehler zu behandeln usw.) |
| 8 | socket.pause() Pausiert das Lesen von Daten. Das heißt, das data-Ereignis wird nicht mehr ausgelöst. Sehr nützlich zum Steuern von Uploads. |
| 9 | socket.resume() Setzt das Lesen von Daten nach dem Aufruf von pause() fort. |
| 10 | socket.setTimeout(timeout[, callback]) Versetzt den Socket nach mehr als timeout Millisekunden Inaktivität in einen Timeout. |
| 11 | socket.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. |
| 12 | socket.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. |
| 13 | socket.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' }. |
| 14 | socket.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. |
| 15 | socket.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 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 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
- Chat-Anwendung: Einen Echtzeit-Chat-Server erstellen
- Spielserver: Echtzeit-Multiplayer-Interaktion verarbeiten
- Proxy-Server: Client-Anfragen weiterleiten
- Benutzerdefiniertes Protokoll: Spezifische Anwendungsschicht-Protokolle implementieren
- IoT-Gerätekommunikation: Mit eingebetteten Geräten kommunizieren
Best Practices
- Fehlerbehandlung: Immer auf das 'error'-Ereignis lauschen
- Ressourcenverwaltung: Nicht mehr verwendete Verbindungen rechtzeitig schließen
- Leistungsüberlegungen: Bei Szenarien mit hoher Nebenläufigkeit die Verwendung eines Verbindungspools in Betracht ziehen
- Sicherheit: Implementieren Sie geeignete Authentifizierungs- und Verschlüsselungsmechanismen
- Protokollierung: Aufzeichnung wichtiger Verbindungsereignisse und Daten
Beispiel
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.
Weitere Erweiterungen
Integrierte Module in Node.js