Vielleicht sind Sie neugierig, wie Proxyserver funktionieren und wie sie Daten über das Internet bereitstellen. In diesem Blog werde ich einen Proxyserver mithilfe von Core-NodeJs implementieren. Dies habe ich mithilfe eines Core-NodeJs-Pakets namens „net“ erreicht, das bereits mit NodeJs geliefert wird.
Ein Proxyserver ist ein Agent zwischen dem Client und dem Server. Wenn ein
Wenn der Client eine Anfrage an einen Server sendet, wird diese an einen Ziel-Proxy weitergeleitet
Server. Der Ziel-Proxyserver verarbeitet die Anfrage und sendet sie
an den Hauptserver und der Hauptserver sendet die Rückanfrage an den
Proxyserver und der Proxyserver sendet die Anfrage an den Client.
Bevor Sie mit dem Programmieren beginnen, wissen Sie wenig über Socket und NodeJs. Sie wissen, was ein Socket ist und wie sie funktionieren.
In NodeJs gibt es zwei Methoden zum Implementieren eines Proxyservers. Zuerst benutzerdefinierte Methode und zweitens eingebaut. Beides ist leicht zu verstehen.
Um Ihren Proxy-Server zu testen, können Sie Ihren lokalen HTTP-Server auf Ihrem lokalen Computer ausführen und dann den Host-Computer als Ziel verwenden.
const net = require('net'); // Define the target host and port const targetHost = 'localhost'; // Specify the hostname of the target server. For Ex: (12.568.45.25) const targetPort = 80; // Specify the port of the target server
const server = net.createServer((clientSocket) => { }); // Start listening for incoming connections on the specified port const proxyPort = 3000; // Specify the port for the proxy server server.listen(proxyPort, () => { console.log(`Reverse proxy server is listening on port ${proxyPort}`); });
Im Server-Funktionsrückruf haben wir einen Parameter clientSocket, es ist die Benutzerverbindung, die wir für die Verbindung erhalten haben.
Daten vom Benutzer akzeptieren und empfangen
const targetHost = 'localhost'; // Specify the hostname of the target server. For Ex: (12.568.45.25) const targetPort = 80; // Specify the port of the target server // Create a TCP server const server = net.createServer((clientSocket) => { // Establish a connection to the target host net.createConnection({host: targetHost, port: targetPort}, () => { // When data is received from the client, write it to the target server clientSocket.on("data", (data) => { targetSocket.write(data); }); // When data is received from the target server, write it back to the client targetSocket.on("data", (data) => { clientSocket.write(data); }); }); });
clientSocket.on("data", (data) => { targetSocket.write(data); });
targetSocket.on("data", (data) => { clientSocket.write(data); });
Während es spannend ist, die Funktionalität des Proxyservers zu erkunden, erfordert die Gewährleistung der Zuverlässigkeit robuste Fehlerbehandlungsmethoden, um unerwartete Probleme elegant zu bewältigen. Um diese Art von Fehlern zu behandeln, gibt es ein Ereignis namens Fehler. Es ist sehr einfach umzusetzen.
const server = net.createServer((clientSocket) => { // Establish a connection to the target host const targetSocket = net.createConnection({host: targetHost,port: targetPort}, () => { // Handle errors when connecting to the target server targetSocket.on('error', (err) => { console.error('Error connecting to target:', err); clientSocket.end(); // close connection }); // Handle errors related to the client socket clientSocket.on('error', (err) => { console.error('Client socket error:', err); targetSocket.end(); // close connection }); }); });
const net = require('net'); // Define the target host and port const targetHost = 'localhost'; // Specify the hostname of the target server const targetPort = 80; // Specify the port of the target server // Create a TCP server const server = net.createServer((clientSocket) => { // Establish a connection to the target host const targetSocket = net.createConnection({ host: targetHost, port: targetPort }, () => { // When data is received from the target server, write it back to the client targetSocket.on("data", (data) => { clientSocket.write(data); }); // When data is received from the client, write it to the target server clientSocket.on("data", (data) => { targetSocket.write(data); }); }); // Handle errors when connecting to the target server targetSocket.on('error', (err) => { console.error('Error connecting to target:', err); clientSocket.end(); }); // Handle errors related to the client socket clientSocket.on('error', (err) => { console.error('Client socket error:', err); targetSocket.end(); }); }); // Start listening for incoming connections on the specified port const proxyPort = 3000; // Specify the port for the proxy server server.listen(proxyPort, () => { console.log(`Reverse proxy server is listening on port ${proxyPort}`); });
Um die Komplexität der Client- und Serververbindung zu reduzieren, haben wir eine integrierte Methodenpipe. Ich werde diese Syntax ersetzen
// Handle errors when connecting to the target server targetSocket.on("data", (data) => { clientSocket.write(data); }); // When data is received from the client, write it to the target server clientSocket.on("data", (data) => { targetSocket.write(data); });
In diese Syntax
// Pipe data from the client to the target clientSocket.pipe(targetSocket); // When data is received from the client, write it to the target server targetSocket.pipe(clientSocket);
const net = require('net'); // Define the target host and port const targetHost = 'localhost'; const targetPort = 80; // Create a TCP server const server = net.createServer((clientSocket) => { // Establish a connection to the target host const targetSocket = net.createConnection({ host: targetHost, port: targetPort }, () => { // Pipe data from the client to the target clientSocket.pipe(targetSocket); // Pipe data from the target to the client targetSocket.pipe(clientSocket); }); // Handle errors targetSocket.on('error', (err) => { console.error('Error connecting to target:', err); clientSocket.end(); }); clientSocket.on('error', (err) => { console.error('Client socket error:', err); targetSocket.end(); }); }); // Start listening for incoming connections const proxyPort = 3000; server.listen(proxyPort, () => { console.log(`Reverse proxy server is listening on port ${proxyPort}`); });
Folgen Sie mir auf GitHub avinashtare, Danke.
Das obige ist der detaillierte Inhalt vonSo erstelle ich einen Scratch-Proxyserver mit Node.js. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!