【问题标题】:Having a TCP connection behind a URL with a path Nodejs在带有路径 Nodejs 的 URL 后面有一个 TCP 连接
【发布时间】:2020-11-04 13:36:33
【问题描述】:

我想要一个 HTTP 服务器,只要我在浏览器的 URL 中指定给定路径,就可以与远程计算机建立 TCP 连接。

例如...假设我有一台具有公共 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);

有没有办法做到这一点?

【问题讨论】:

    标签: javascript node.js http tcp


    【解决方案1】:

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

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

    但您会遇到其他问题,因为现在您的代码正在有效地处理 HTTP 请求/响应,因此在与上游服务器通信时,您需要解析和重建请求/响应数据。

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

    【讨论】:

    • 谢谢!非常有帮助!我使用net 而不是http 遇到的唯一问题是我不知道如何解析来自套接字的请求数据并从中获取路径。你知道这样做的方法吗?
    • @Didash 您必须制作自己的 HTTP 解析器。老实说,由于您只需要路径,因此我可能只是按行拆分,然后拆分顶行。 HTTP 请求有很多奇怪的边缘情况,但你不需要关心这些,因为你只需要路径。
    • 非常感谢!你真的帮助了我。非常具体的答案。正是我需要的。
    猜你喜欢
    • 2021-01-27
    • 1970-01-01
    • 1970-01-01
    • 2021-09-16
    • 2013-12-09
    • 1970-01-01
    • 2016-11-19
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多