在 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 请求。
我想要一个 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 请求。