ホームページ  >  記事  >  ウェブフロントエンド  >  Node.js を使用してスクラッチ プロキシ サーバーを構築する方法

Node.js を使用してスクラッチ プロキシ サーバーを構築する方法

WBOY
WBOYオリジナル
2024-07-17 14:23:08576ブラウズ

プロキシ サーバーがどのように動作し、インターネット上でデータをどのように提供するかについて興味があるかもしれません。このブログでは、コア NodeJs を使用してプロキシ サーバーを実装します。これは、NodeJs に既に付属している net と呼ばれるコア NodeJs パッケージを使用して実現しました。

プロキシの仕組み

プロキシ サーバーは、クライアントとサーバーの間のエージェントです。

のとき クライアントがサーバーにリクエストを送信すると、ターゲット プロキシに転送されます
サーバ。ターゲットのプロキシ サーバーがリクエストを処理して送信します
メインサーバーに送信され、メインサーバーはバックリクエストを
に送信します。 プロキシサーバーとプロキシサーバーはリクエストをクライアントに送信します。

preview image

プロキシサーバーを設定する

プログラミングを始める前は、ソケットと NodeJ についてほとんど知りません。ソケットとは何か、そしてそれらがどのように機能するかは知っています。
NodeJs でプロキシ サーバーを実装するには 2 つの方法があります。最初にカスタムメソッドを作成し、2 番目にインビルドを実行します。どちらもわかりやすいです

プロキシ サーバーをテストするには、ローカル マシン上でローカル HTTP サーバーを実行し、ホスト マシンをターゲットにすることができます。

  • 次に、ネットパッケージを定義し、ターゲットサーバーとポート番号を記述します。
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
  • 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}`);
});
  • net パッケージを使用してサーバーを作成しました。これは、proxyPort 変数を使用して定義したポート番号 3000 を実行している TCP サーバーです。サーバーが起動すると、コンソールに「リバース プロキシ サーバーがポート 3000 でリッスンしている」というメッセージが表示されます。
  • クライアントがプロキシ サーバーに接続しようとすると、createServer 内にあるコールバック関数が実行されます。
  • サーバー関数のコールバックには、clientSocket パラメーターが 1 つあります。これは、接続のために受信したユーザー接続です。

  • ユーザーからのデータを受け入れて受信します

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);
        });
    });
});
  • クライアントがプロキシ サーバーに接続しようとすると、create createConnection を使用してサーバーへの一時的な接続が作成されます。
  • createServerには2つの引数があります
    • 接続したい最初のホスト この場合、targetHost 変数で定義されているサーバー ホストに接続する必要があります。
    • 接続する 2 番目のポート この場合、targetPort 変数で定義されているサーバー ポートに接続する必要があります。
  • ここで、ユーザーがデータを送信するときに、このデータをサーバーに渡します。このコードを使用して
 clientSocket.on("data", (data) => {
     targetSocket.write(data);
 });
  • その後、サーバーはデータを送信します。このコードを使用してこのデータをユーザーに送信します
  targetSocket.on("data", (data) => {
      clientSocket.write(data);
  });
  • おめでとうございます!プロキシ サーバーが正常に作成されました。

エラー処理

プロキシ サーバーの機能を調べるのは興味深いことですが、信頼性を確保するには、予期しない問題を適切に処理するための堅牢なエラー処理方法が必要です。このような種類のエラーを処理するために、エラーと呼ばれるイベントがあります。実装はとても簡単です。

    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}`);
});

構築されたメソッド

クライアントとサーバーの接続の複雑さを軽減するために、メソッド パイプが組み込まれています。この構文を置き換えます

// 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);
});

この構文へ

// 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}`);
});

動作するプロキシサーバー!

GitHub avinashtare をフォローしてください。ありがとうございます。

以上がNode.js を使用してスクラッチ プロキシ サーバーを構築する方法の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。