Maison > interface Web > js tutoriel > le corps du texte

Comment créer un serveur proxy Scratch à l'aide de Node.js

WBOY
Libérer: 2024-07-17 14:23:08
original
600 Les gens l'ont consulté

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.

Comment fonctionne le proxy

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.

preview image

Configurer le serveur proxy

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.

  • Maintenant, je vais définir le package net, puis écrire le serveur cible et le numéro de port.
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
Copier après la connexion
  • Création et écoute du serveur TCP.
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}`);
});
Copier après la connexion
  • nous avons créé un serveur en utilisant le package net. c'est un serveur TCP qui exécute le numéro de port 3000 comme nous le définissons en utilisant la variable proxyPort. si le serveur démarre, il affichera le message Le serveur proxy inverse écoute sur le port 3000 sur la console.
  • Lorsque le client essaie de se connecter au serveur proxy, il exécute la fonction de rappel qui se trouve à l'intérieur de createServer.
  • 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);
        });
    });
});
Copier après la connexion
  • Lorsqu'un client essaie de se connecter au serveur proxy, nous créerons une connexion temporaire au serveur en utilisant create createConnection
  • createServer a 2 arguments
    • 1er hôte où nous voulons nous connecter dans ce cas, nous devons nous connecter à notre serveur hôte qui est défini dans la variable targetHost.
    • 2ème port où nous voulons nous connecter dans ce cas nous devons nous connecter au port de notre serveur qui est défini dans la variable targetPort.
  • Maintenant, lorsque l'utilisateur envoie des données, je transmets ces données au serveur. en utilisant ce code
 clientSocket.on("data", (data) => {
     targetSocket.write(data);
 });
Copier après la connexion
  • Ensuite, le serveur envoie des données. J'enverrai ces données à l'utilisateur, en utilisant ce code
  targetSocket.on("data", (data) => {
      clientSocket.write(data);
  });
Copier après la connexion
  • Félicitations ! vous avez créé avec succès votre serveur proxy.

Gestion des erreurs

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
       });
     });
   });
Copier après la connexion
  • Lorsqu'une erreur se produit, nous consolerons l'erreur puis fermerons la connexion.

TOUS les codes

  • remplacez le nom d'hôte et le numéro de port selon vos préférences.
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}`);
});
Copier après la connexion

Méthode construite

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);
});
Copier après la connexion

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);
Copier après la connexion

Voici tout le code

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}`);
});
Copier après la connexion

Un serveur proxy fonctionnel !

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!

source:dev.to
Déclaration de ce site Web
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn
Tutoriels populaires
Plus>
Derniers téléchargements
Plus>
effets Web
Code source du site Web
Matériel du site Web
Modèle frontal