想写静态资源服务器,首先我们需要知道如何创建一个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"));
内容版权声明:除非注明,否则皆为本站原创文章。

