使用node js 实现一个简单代理服务器

2,584 阅读1分钟

什么是代理服务器

简单来说,就是把请求发个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连接,数据就这样一对一的转发。

有时间再增加一些难度。这个只是做一个简单的数据代理,那如何做一个内网穿透的功能呢?