首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在URL后面具有路径为Nodejs的TCP连接

在URL后面具有路径为Nodejs的TCP连接
EN

Stack Overflow用户
提问于 2020-07-15 13:47:35
回答 1查看 366关注 0票数 1

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

例如..。假设我有一台具有公共IP地址和主机名的计算机作为服务器(mydomain.com:9000),以及一台具有本地IP地址(192.168.0.1)的远程计算机连接到服务器。不知何故,我想在客户端和远程计算机之间建立TCP连接。为了简单起见,只需输入一个带有路径的URL (mydomain.com:9000/remote)。不能使用另一个端口!此外,我希望连接完成时,只有当该路径被输入。

为了更好地说明系统是如何工作的:

代码语言:javascript
复制
      _________                       _________                       _________
      |       |       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隧道代理,它工作得很好。但是当我尝试实现path时,它并没有实现。

代码语言:javascript
复制
//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);

有没有办法做到这一点?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2020-07-15 14:04:20

在您的代码中,您会发现connection事件在请求处理程序回调被调用之前就已经触发了。这是因为在客户端发出其connection请求之前,从客户端进行连接的客户端发生了TCP连接(为此触发了TCP事件)。此外,您所拥有的不会真正可靠地工作,因为HTTP keep-alive可能意味着多个请求将来自单个TCP连接。

要解决这个问题,需要将connection事件中的所有代码上移到HTTP请求处理程序中。

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

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

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/62908350

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档