什么是代理服务器
简单来说,就是把请求发个A服务,A服务做一些简单的处理,然后再把请求原封不动的发给B服务期,B服务器才是真正的目标服务器。
实现
现有核心代码实现该功能,如果有需要添加的功能,再去对应的地方添加,比如拦截请求,记录日志,错误处理,等等。
const net = require('net')
// 有请求就创建一个tcp链接
net.createServer(client => {
client.on('error', error => console.log('client', error))
client.on('data', req => {
// 创建与b服务的链接
const bSserve = new net.Socket()
bSserve.connect(8088, 'localhost')
bSserve.on('error', error => console.log('bSserve', error))
// 把请求发送给b服务器
bSserve.write(req)
bSserve.on('data', res => {
// 把响应发送给客户端
client.write(res)
})
})
}).listen(80)
只这几行就创建了一个简单的代理,可以把代码拷贝下来,在本地试一试。需要修改一下端口。把8088修改为你要代理的服务器端口就行了。
拦截请求、响应数据
在代码的如下位置做响应处理
const net = require('net')
// 有请求就创建一个tcp链接
net.createServer(client => {
client.on('error', error => console.log('client', error))
client.on('data', req => {
+ // 请求的处理
+ const content = req.toString()
+ console.log(content)
// 创建与b服务的链接
const bSserve = new net.Socket()
bSserve.connect(8088, 'localhost')
bSserve.on('error', error => console.log('bSserve', error))
// 把请求发送给b服务器
bSserve.write(req)
bSserve.on('data', res => {
+ // 响应的处理
+ const content = res.toString()
+ console.log(content)
// 把响应发送给客户端
client.write(res)
})
})
}).listen(80)
总结
核心功能就是通过nodejs的net模块,创建一个serve。客户端的每个请求都会与目标服务器简历一个tcp连接,数据就这样一对一的转发。
有时间再增加一些难度。这个只是做一个简单的数据代理,那如何做一个内网穿透的功能呢?