1 响应
我们知道http响应的时候一般会设置content-length告诉客户端,响应中响应体有多少个字节(如果有响应体的话)。但是很多时候我们在响应的时候,不知道有多少字节需要返回,但又希望不要拿到全部数据的时候才一起返回,而是部分返回,那么这时候我们就无法设置content-length了,那怎么办呢?http协议中有一个头可以支持这个功能。那就是Transfer-Encoding: chunked。chunked模式支持分块返回数据给客户端。但是不管是什么模式,无规矩不成方圆,http协议必须定义http解析器怎么判断响应结束了。下面我们看看chunk模式的时候,协议格式是怎样的。
...
响应头\r\n
\r\n(响应头结束,下面是响应体开始)
长度1\r\n
数据1\r\n
长度2\r\n
数据2\r\n
0\r\n(标记响应体内容结束)
\r\n
下面我们使用nodejs实现一个服务器,看chunk模式是怎么实现的。
const http = require('http')
http.createServer(function(req, res) {
const { socket } = res;
// 攒到一起再发送
socket.cork();
// 响应行
socket.write('HTTP/1.1 200 OK');
socket.write('\r\n');
// 响应头
socket.write('Transfer-Encoding: chunked\r\nhello: world\r\n');
socket.write('\r\n');
// 响应体
// 长度,十六进制
socket.write('5\r\n');
socket.write('xxxxx\r\n');
// 长度,十六进制
socket.write('a\r\n');
socket.write('yyyyyyyyyy\r\n');
// chunk结束
socket.write('0\r\n');
socket.write('\r\n');
// 允许发送
socket.uncork();
// 关闭连接
socket.destroy();
}).listen(80);
我们访问该服务器,服务器就会返回对应的数据。
响应头
响应体
了解基本的原理后我们来做一些好玩的。