Skip to content

Latest commit

 

History

History
49 lines (40 loc) · 1.4 KB

套接字作业4-多线程Web代理服务器.md

File metadata and controls

49 lines (40 loc) · 1.4 KB

nodejs 实现 (部分伪代码)

书中的问题描述和官方文档描述略有区别,书中强调多线程的实现,官方文档强调缓存的实现,以官方文档为准。

const net = require('net')
const fs = require('fs')

let clientSocket

const server = net.createServer(function(socket) {
  console.log('client connected, address -  ', socket.remoteAddress, ' port - ', socket.remotePort);
  socket.setEncoding('utf-8')
  socket.on('data', function(data) {
    const httpList = data.split('\r\n')
    const head = httpList[0]
    const host = httpList[1].split(':')[1]
    const [method, url, version] = head.split(' ')
    const filename = url.split('/')[2]
    var folder_exists = fs.existsSync('./'+filename)
    if(folder_exists) {
      const html = fs.readFileSync('./'+filename, 'utf-8')
      socket.write(html)
    } else {
      // 这块是伪代码,请求源数据需要 HTTP 协议 请求
      clientSocket = net.connect({host:host+url, port: 80}, function() {})

      clientSocket.on('data', function(data) {
        fs.writeFileSync('./'+filename, data)
        socket.write(data)
      })
    }
  })
  socket.on('end', function() {
    console.log('client disconnected')
  })
  socket.on('error', function(err) {
    console.log('socket error - ', err)
  })
})


server.maxConnections = 1
server.listen(8899, function() {
  console.log('echo server bound at port - 8899');
})