在 URL 后面有一个 TCP 连接,路径为 Nodejs

Having a TCP connection behind a URL with a path Nodejs

我想要一个 HTTP 服务器,它允许我在浏览器中指定 URL 内的给定路径时与远程计算机建立 TCP 连接。

例如...假设我有一台具有 public IP 地址和主机名作为服务器的计算机 (mydomain.com:9000) 和一台具有本地 IP 地址的远程计算机(192.168.0.1) 连接到服务器。我想以某种方式在客户端和远程计算机之间建立 TCP 连接。为了使它更容易,只需输入带有路径的 URL (mydomain.com:9000/remote)。不使用其他端口!另外,我希望当且仅当输入该路径时才能完成连接。

为了更好地说明系统的工作原理:

      _________                       _________                       _________
      |       |       internet        |       |     local network     |       |
      |_______|      ---------->      |_______|      ---------->      |_______|
      ____|____      <----------      ____|____      <----------      ____|____
        client                          server                      remote computer
   sends http request                checks path                   gets http request
mydomain.com:9000/remote      establishes TCP connection            handles request

我用 node js 做了一些代码来确保连接是可能的。是的,现在我只需要能够检查路径并建立连接即可。我的代码是一个简单的 TCP 隧道代理,它工作正常。但是当我尝试实现它没有的路径时。

//Import modules
const net = require('net');
const http = require('http');

let inpath = false;

// Create proxy server
const proxy = http.createServer( function(req,res){
    console.log(req.url);

    //Check path
    if(req.url == '/remote')
        inpath = true;
});

proxy.on('connection', client => {

    if(inpath)
    {
        const remote = new net.Socket();

        //Establish connection
        remote.connect(80,'192.168.0.100');

        client.on('error', err => {
            console.log('Error: ' + err);
            proxy.close();
        });
        
        //Port-forwarding
        client.pipe(remote);
        remote.pipe(client);
    }
});
proxy.listen(9000);

有办法吗?

在您的代码中,您会发现 connection 事件在您的请求处理程序回调被调用之前就已触发。这是因为 TCP 连接(触发 connection 事件)是在客户端发出 HTTP 请求之前从客户端连接发生的。此外,您所拥有的并不会真正可靠地工作,因为 HTTP 保持活动状态可能意味着多个请求将通过单个 TCP 连接。

要解决此问题,您需要将 connection 事件中的所有代码移至 HTTP 请求处理程序。

你会 运行 遇到其他问题,因为现在你的代码正在有效地处理 HTTP request/response,所以你需要解析和重建 request/response 数据与上游服务器通信时。

如果您确实希望在 TCP 级别处理此问题,请不要使用 http.createServer()。请改用 net 并创建一个普通的 TCP 服务器。然后,自己解析请求数据,如果在请求中找到你想要的特定路径,则进行代理 TCP 连接,并确保将现有缓冲区发送下来,以便上游服务器可以获得完整的 HTTP 请求。