Vous pourriez être curieux de savoir comment fonctionnent les serveurs proxy et comment ils diffusent des données sur Internet. Dans ce blog, je vais implémenter un serveur proxy utilisant NodeJs de base. J'y suis parvenu en utilisant un package NodeJs de base appelé net qui est déjà fourni avec NodeJs.
un serveur proxy est un agent entre le client et le serveur. Quand un
le client envoie une requête à un serveur, elle est transmise à un proxy cible
serveur. Le serveur proxy ciblé traite la requête et l'envoie
au serveur principal et le serveur principal envoie la demande de retour au
serveur proxy et le serveur proxy envoie la demande au client.
Avant de commencer la programmation, vous savez peu de choses sur socket et NodeJs. Vous savez ce qu'est un socket et comment ils fonctionnent.
Dans NodeJs, il existe deux méthodes pour implémenter un serveur proxy. D'abord, j'ai une méthode personnalisée et ensuite une méthode intégrée. Les deux sont faciles à comprendre.
Pour tester votre serveur proxy, vous pouvez exécuter votre service HTTP local sur votre machine locale, puis cibler la machine hôte.
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}`); });
Dans le rappel de la fonction serveur, nous avons un paramètre clientSocket, c'est la connexion utilisateur que nous avons reçue pour la connexion.
accepter et recevoir les données de l'utilisateur
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); });
Bien qu'explorer les fonctionnalités du serveur proxy soit passionnant, garantir la fiabilité nécessite des méthodes robustes de gestion des erreurs pour gérer les problèmes inattendus avec élégance. Pour gérer ces types d’erreurs, nous avons un événement appelé erreur. C'est très simple à mettre en œuvre.
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}`); });
Pour réduire la complexité des connexions client et serveur, nous avons un canal de méthode intégré. Je remplacerai cette syntaxe
// 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); });
Dans cette syntaxe
// 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}`); });
Suivez-moi sur GitHub avinashtare, merci.
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!