[英]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.