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.
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.
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.
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}`); });
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); }); }); });
clientSocket.on("data", (data) => { targetSocket.write(data); });
targetSocket.on("data", (data) => { clientSocket.write(data); });
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 }); }); });
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}`); });
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);
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}`); });
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!