想写静态资源服务器,首先我们需要知道如何创建一个http服务器,它的原理是什么
http服务器是继承自tcp服务器 http协议是应用层协议,是基于TCP的
http的原理是对请求和响应进行了包装,当客户端连接上来之后先触发connection事件,然后可以多次发送请求,每次请求都会触发request事件
let server = http.createServer(); let url = require('url'); server.on('connection', function (socket) { console.log('客户端连接 '); }); server.on('request', function (req, res) { let { pathname, query } = url.parse(req.url, true); let result = []; req.on('data', function (data) { result.push(data); }); req.on('end', function () { let r = Buffer.concat(result); res.end(r); }) }); server.on('close', function (req, res) { console.log('服务器关闭 '); }); server.on('error', function (err) { console.log('服务器错误 '); }); server.listen(8080, function () { console.log('server started at http://localhost:8080'); });
- req 代表客户端的连接,server服务器把客户端的请求信息进行解析,然后放在req上面
- res 代表响应,如果希望向客户端回应消息,需要通过 res
- req和res都是从socket来的,先监听socket的data事件,然后等事件发生的时候,进行解析,解析出请头对象,再创建请求对象,再根据请求对象创建响应对象
- req.url 获取请求路径
- req.headers 请求头对象
接下来我们对一些核心功能进行讲解
深刻理解并实现压缩和解压
为什么要压缩呢?有什么好处?
可以使用zlib模块进行压缩及解压缩处理,压缩文件以后可以减少体积,加快传输速度和节约带宽代码
压缩和解压缩对象都是transform转换流,继承自duplex双工流即可读可写流
- zlib.createGzip:返回Gzip流对象,使用Gzip算法对数据进行压缩处理
- zlib.createGunzip:返回Gzip流对象,使用Gzip算法对压缩的数据进行解压缩处理
- zlib.createDeflate:返回Deflate流对象,使用Deflate算法对数据进行压缩处理
- zlib.createInflate:返回Deflate流对象,使用Deflate算法对数据进行解压缩处理
实现压缩和解压
因为压缩我文件可能很大也可能很小,所以为了提高处理速度,我们用流来实现
let fs = require("fs"); let path = require("path"); let zlib = require("zlib"); function gzip(src) { fs .createReadStream(src) .pipe(zlib.createGzip()) .pipe(fs.createWriteStream(src + ".gz")); } gzip(path.join(__dirname,'msg.txt')); function gunzip(src) { fs .createReadStream(src) .pipe(zlib.createGunzip()) .pipe( fs.createWriteStream(path.join(__dirname, path.basename(src, ".gz"))) ); } gunzip(path.join(__dirname, "msg.txt.gz"));
内容版权声明:除非注明,否则皆为本站原创文章。