Rumah  >  Artikel  >  hujung hadapan web  >  Bagaimana Saya Membina Pelayan Proksi Scratch Menggunakan Node.js

Bagaimana Saya Membina Pelayan Proksi Scratch Menggunakan Node.js

WBOY
WBOYasal
2024-07-17 14:23:08493semak imbas

Anda mungkin ingin tahu tentang cara pelayan proksi berfungsi dan cara mereka menyampaikan data melalui Internet. Dalam blog ini, saya akan melaksanakan pelayan proksi menggunakan teras NodeJs. Saya mencapai ini menggunakan pakej teras NodeJs yang dipanggil net yang sudah disertakan dengan NodeJs.

Cara Proksi Berfungsi

pelayan proksi ialah ejen antara pelanggan dan pelayan. Apabila a

klien menghantar permintaan kepada pelayan yang dimajukan kepada proksi sasaran
pelayan. Pelayan proksi yang disasarkan memproses permintaan dan menghantarnya
ke pelayan utama dan pelayan utama menghantar permintaan kembali ke
pelayan proksi dan pelayan proksi menghantar permintaan kepada klien.

preview image

Sediakan Pelayan Proksi

Sebelum ini, memulakan pengaturcaraan anda tahu sedikit tentang soket dan NodeJs. Anda tahu apa itu soket dan cara ia berfungsi.
Dalam NodeJs Terdapat dua kaedah untuk melaksanakan pelayan proksi. Pertama saya kaedah tersuai dan kedua dalam binaan. Kedua-duanya mudah difahami.

Untuk menguji pelayan proksi anda, anda boleh menjalankan perkhidmatan HTTP setempat anda pada mesin tempatan anda dan kemudian menyasarkan mesin hos.

  • Sekarang, saya akan menentukan pakej bersih dan kemudian menulis pelayan sasaran dan nombor 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
  • Mencipta dan mendengar pelayan 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}`);
});
  • kami telah mencipta pelayan menggunakan pakej bersih. ia adalah pelayan TCP yang menjalankan nombor port 3000 seperti yang kami takrifkan dalam menggunakan pembolehubah proxyPort. jika pelayan dimulakan ia akan menunjukkan pelayan proksi Songsang sedang mendengar pada mesej port 3000 pada konsol.
  • apabila pelanggan cuba menyambungkan pelayan proksi, ia menjalankan fungsi panggil balik yang terdapat di dalam createServer.
  • Dalam panggilan balik fungsi pelayan kami mempunyai satu parameter clientSocket iaitu sambungan pengguna yang kami terima untuk sambungan.

  • terima dan terima data daripada pengguna

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);
        });
    });
});
  • Apabila pelanggan cuba menyambungkan pelayan proksi, kami akan membuat sambungan sementara ke pelayan menggunakan create createConnection
  • createServer mempunyai 2 argumen
    • Hos Pertama di mana kami ingin menyambung dalam kes ini, kami perlu menyambung ke hos pelayan kami yang ditakrifkan dalam pembolehubah targetHost.
    • Port ke-2 di mana kami ingin menyambung dalam kes ini kami perlu menyambung ke port pelayan kami yang ditakrifkan dalam pembolehubah targetPort.
  • Kini, Apabila pengguna menghantar data, saya akan menghantar data ini kepada pelayan. menggunakan kod ini
 clientSocket.on("data", (data) => {
     targetSocket.write(data);
 });
  • Kemudian, Pelayan menghantar data saya akan menghantar data ini kepada pengguna, menggunakan kod ini
  targetSocket.on("data", (data) => {
      clientSocket.write(data);
  });
  • Tahniah! anda berjaya mencipta pelayan proksi anda.

Pengendalian Ralat

Sambil meneroka kefungsian pelayan proksi adalah menarik, memastikan kebolehpercayaan memerlukan kaedah pengendalian ralat yang mantap untuk menangani isu yang tidak dijangka dengan anggun. Untuk mengendalikan jenis ralat tersebut, kami mempunyai peristiwa yang dipanggil ralat. Ia sangat mudah untuk dilaksanakan.

    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
       });
     });
   });
  • apabila berlaku sebarang ralat, kami akan menenangkan ralat itu dan kemudian menutup sambungan.

SEMUA Kod

  • ganti nama hos dan nombor port mengikut keutamaan anda.
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}`);
});

Kaedah Terbina

Untuk mengurangkan kerumitan sambungan pelanggan dan pelayan, kami mempunyai paip kaedah terbina dalam. Saya akan menggantikan sintaks ini

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

Ke dalam sintaks ini

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

Ini semua kod

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

Pelayan Proksi yang Berfungsi!

Ikuti Saya Di GitHub avinashtare, Terima kasih.

Atas ialah kandungan terperinci Bagaimana Saya Membina Pelayan Proksi Scratch Menggunakan Node.js. Untuk maklumat lanjut, sila ikut artikel berkaitan lain di laman web China PHP!

Kenyataan:
Kandungan artikel ini disumbangkan secara sukarela oleh netizen, dan hak cipta adalah milik pengarang asal. Laman web ini tidak memikul tanggungjawab undang-undang yang sepadan. Jika anda menemui sebarang kandungan yang disyaki plagiarisme atau pelanggaran, sila hubungi admin@php.cn