我想要一个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隧道代理,它工作得很好。但是当我尝试实现path时,它并没有实现。
//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);有没有办法做到这一点?
发布于 2020-07-15 14:04:20
在您的代码中,您会发现connection事件在请求处理程序回调被调用之前就已经触发了。这是因为在客户端发出其connection请求之前,从客户端进行连接的客户端发生了TCP连接(为此触发了TCP事件)。此外,您所拥有的不会真正可靠地工作,因为HTTP keep-alive可能意味着多个请求将来自单个TCP连接。
要解决这个问题,需要将connection事件中的所有代码上移到HTTP请求处理程序中。
不过,您还会遇到其他问题,因为现在您的代码正在有效地处理HTTP请求/响应,因此在与上游服务器通信时,您将需要解析和重新构建请求/响应数据。
如果您确实希望在TCP级别处理此问题,请不要使用http.createServer()。改用net并创建一个普通的TCP服务器。然后,自己解析请求数据,如果在请求中找到了想要的特定路径,则建立代理TCP连接,并确保向下发送现有的缓冲区,以便上游服务器可以获得完整的HTTP请求。
https://stackoverflow.com/questions/62908350
复制相似问题