【问题标题】:Node JS TCP Proxy: Reuse socket in callback functionNode JS TCP 代理:在回调函数中重用套接字
【发布时间】:2015-07-20 17:53:16
【问题描述】:

我正在尝试在 Node JS 中实现 TCP 代理。我只对 Javascript 有一些经验,所以在此过程中遇到了很多问题。我已经做了很多搜索,但没有运气。

当浏览器发送 HTTPS 的 CONNECT 请求时会出现此问题。我的代理将解析主机名和端口,然后创建一个连接到服务器的新套接字。如果所有这些步骤都顺利,我将开始转发消息。

我的部分代码如下所示:

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 请求需要客户端套接字和服务器套接字都打开,直到一侧关闭连接,所以上面的代码没有这种行为。每次我从客户端收到一些数据时,我都会为服务器创建一个新的套接字,而旧的套接字将被关闭。

有没有办法将服务器套接字存储为全局变量,以便数据事件处理程序可以重用它?或者有没有其他方法可以解决这个问题?

非常感谢!!!!

【问题讨论】:

    标签: node.js networking tcp proxy event-handling


    【解决方案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);
                  }
             }
        }        
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-07-21
      • 2019-05-23
      • 2012-09-10
      • 2018-07-03
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-05-05
      相关资源
      最近更新 更多