Proxy Node JS TCP: Gunakan kembali soket dalam fungsi panggilan balik

Saya mencoba mengimplementasikan proxy TCP di Node JS. Saya hanya memiliki sedikit pengalaman dengan Javascript jadi saya menemui banyak masalah selama prosesnya. Saya telah melakukan banyak pencarian untuk yang ini tetapi tidak berhasil.

Masalah terjadi ketika browser mengirimkan permintaan CONNECT untuk HTTPS. Proksi saya akan mengurai nama host dan port, lalu membuat soket baru yang terhubung ke server. Jika semua langkah ini berjalan dengan baik, saya akan mulai meneruskan pesan.

Bagian dari kode saya terlihat seperti ini:

var net = require('net');

var server = net.createServer(function(clientSock) {

    clientSock.on('data', function(clientData) {

         var host = // get from data
         var port = // get from data

         if (data is a CONNECT request) {

              // Create a new socket to server
              var serverSock = new net.Socket();

              serverSock.connect(port, host, function() {
                  serverSock.write(clientData);

                  clientSock.write('HTTP/1.1 200 OK\r\n');
              }

              serverSock.on('data', function(serverData) {
                  clientSock.write(serverData);
              }
         }
    }        
}

Karena permintaan CONNECT memerlukan soket klien dan soket server terbuka hingga satu sisi menutup koneksi, kode di atas tidak memiliki perilaku ini. Setiap kali saya menerima beberapa data dari klien, saya akan membuat soket baru ke server dan yang lama ditutup.

Apakah ada cara untuk menyimpan soket server sebagai variabel global sehingga pengendali kejadian data dapat menggunakannya kembali? Atau adakah cara lain untuk mengatasi hal ini?

Terima kasih banyak!!!!


person KField    schedule 10.05.2015    source sumber


Jawaban (1)


Anda cukup memindahkan variabel ke cakupan yang lebih tinggi sehingga dapat bertahan di beberapa peristiwa dan kemudian Anda dapat menguji untuk melihat apakah nilainya sudah ada:

var net = require('net');

var server = net.createServer(function(clientSock) {

    var serverSock;
    clientSock.on('data', function(clientData) {

         var host = // get from data
         var port = // get from data

         if (data is a CONNECT request) {

              // Create a new socket to server
              if (!serverSock) {
                  serverSock = new net.Socket();

                  serverSock.connect(port, host, function() {
                      serverSock.write(clientData);

                      clientSock.write('HTTP/1.1 200 OK\r\n');
                  }

                  serverSock.on('data', function(serverData) {
                      clientSock.write(serverData);
                  }
              } else {
                  serverSock.write(clientData);
              }
         }
    }        
}
person jfriend00    schedule 10.05.2015