Node JS TCP Proxy: ใช้ซ็อกเก็ตซ้ำในฟังก์ชันโทรกลับ

ฉันกำลังพยายามใช้พร็อกซี TCP ใน Node JS ฉันมีประสบการณ์กับ Javascript มาบ้างเท่านั้น ดังนั้นฉันจึงพบปัญหามากมายระหว่างทาง ฉันค้นหาสิ่งนี้มาหลายครั้งแล้ว แต่ก็ไม่มีโชค

ปัญหาเกิดขึ้นเมื่อเบราว์เซอร์ส่งคำขอ CONNECT สำหรับ HTTPS พร็อกซีของฉันจะแยกวิเคราะห์ชื่อโฮสต์และพอร์ต จากนั้นสร้างซ็อกเก็ตใหม่ที่เชื่อมต่อกับเซิร์ฟเวอร์ หากทุกขั้นตอนเป็นไปด้วยดี ฉันจะเริ่มส่งต่อข้อความ

ส่วนหนึ่งของรหัสของฉันมีลักษณะดังนี้:

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

เนื่องจากคำขอ CONNECT ต้องการให้ทั้งซ็อกเก็ตไคลเอ็นต์และซ็อกเก็ตเซิร์ฟเวอร์เปิดจนกว่าด้านใดด้านหนึ่งจะปิดการเชื่อมต่อ โค้ดด้านบนจึงไม่มีลักษณะเช่นนี้ ทุกครั้งที่ฉันได้รับข้อมูลจากไคลเอนต์ ฉันจะสร้างซ็อกเก็ตใหม่ไปยังเซิร์ฟเวอร์ และอันเก่าจะถูกปิด

มีวิธีจัดเก็บซ็อกเก็ตเซิร์ฟเวอร์เป็นตัวแปรส่วนกลางเพื่อให้ตัวจัดการเหตุการณ์ข้อมูลสามารถนำกลับมาใช้ใหม่ได้หรือไม่ หรือมีวิธีอื่นในการแก้ปัญหานี้หรือไม่?

ขอบคุณมาก!!!!


person KField    schedule 10.05.2015    source แหล่งที่มา


คำตอบ (1)


คุณสามารถย้ายตัวแปรไปยังขอบเขตที่สูงขึ้นเพื่อให้อยู่รอดได้ในหลายเหตุการณ์ จากนั้นคุณสามารถทดสอบเพื่อดูว่าค่าของมันอยู่ที่นั่นแล้วหรือไม่:

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