簡體   English   中英

在 URL 后面有一個 TCP 連接,路徑是 Nodejs

[英]Having a TCP connection behind a URL with a path Nodejs

我想要一個 HTTP 服務器,只要我在瀏覽器中指定 URL 中的給定路徑,它就可以與遠程計算機建立 TCP 連接。

For example... let's say that I have a computer with a public IP address and a hostname as the server (mydomain.com:9000) and a remote computer with a local IP address (192.168.0.1) connected to the server. 不知何故,我想在客戶端和遠程計算機之間建立 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事件在調用請求處理程序回調之前就已觸發。 這是因為在客戶端發出 HTTP 請求之前,客戶端連接發生了 TCP 連接(觸發connection事件)。 此外,您所擁有的並不能真正可靠地工作,因為 HTTP keep-alive 可能意味着多個請求將來自單個 TCP 連接。

要解決此問題,您需要將connection事件中的所有代碼移至 HTTP 請求處理程序。

但是您會遇到其他問題,因為現在您的代碼正在有效地處理 HTTP 請求/響應,因此在與上游服務器通信時,您需要解析和重建請求/響應數據。

如果您確實希望在 TCP 級別處理此問題,請不要使用http.createServer() 改用net並創建一個普通的 TCP 服務器。 然后,自己解析請求數據,如果在請求中找到你想要的特定路徑,則進行代理 TCP 連接,並確保將現有緩沖區向下發送,以便上游服務器可以獲取完整的 HTTP 請求。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM