import http from "http";
import url from "url";
import util from "util";
import qs from "querystring";
import fs from "fs";
// 默认GET方法响应
const server1 = http.createServer(function(req, res){
res.writeHead(200, {'Content-Type': 'text/plain; charset=utf-8'});
res.end(util.inspect(url.parse(req.url, true)));
});
// 启用服务1
// server1.listen(3000);
// POST方法
const postHTML =
'<html><head><meta charset="utf-8"><title>Node Post表单提交</title></head>' +
'<body>' +
'<form method="post" action="/register/submit">' +
'姓名: <input name="name"><br>' +
'年龄: <input name="age"><br>' +
'<input type="submit">' +
'</form>' +
'</body></html>';
const videoHTML = '<html><head><meta charset="utf-8"><title>Node Post表单提交</title></head>' +
'<video muted controls autoplay="autoplay" preload="auto"><source src="/video/play"></source>您的浏览器不支持video标签</video>' +
'</body></html>'
const server2 = http.createServer(function(req, res){
// 申明变量data用于保存获取到的data
let data = '';
// 监听data获取事件
req.on('data', (chunk) => {
data += chunk; // 转为字符串
});
// 接收完成调用事件
req.on('end', () => {
// 调用的接口
const { pathname } = url.parse(req.url);
const postData = qs.parse(data);
console.log('-----request data-----', postData, pathname); // 转为JSON
// 注册接口路由
if (postData.name && postData.age && pathname === "/register/submit") {
// 设置响应头部信息及编码
res.writeHead(200, {'Content-Type': 'text/html; charset=utf8'});
res.write("姓名:" + postData.name);
res.write("<br>");
res.write("年龄:" + postData.age);
res.write("<br>");
res.write(`恭喜您注册成功,${postData.name}!`);
}
// 进入注册页面的接口路由
if (pathname === "/register") {
// 设置响应头部信息及编码
res.writeHead(200, {'Content-Type': 'text/html; charset=utf8'});
res.write(postHTML);
}
// 打开视频播放页面
if (pathname === "/vedio") {
// 设置响应头部信息及编码
res.writeHead(200, {'Content-Type': 'text/html; charset=utf8'});
res.write(videoHTML);
}
// 传输视频流
if (pathname === "/video/play") {
//使用pipe
// fs.createReadStream('./assets/vedios/vedio.mov')
// .pipe(res);
const path = "./assets/vedios/vedio.mov";
let stat = fs.statSync(path);
let fileSize = stat.size;
let range = req.headers.range;
console.log('-----文件大小-----', fileSize);
console.log('-----头部范围-----', range);
if (range) {
//有range头才使用206状态码
let parts = range.replace(/bytes=/, "").split("-");
let start = parseInt(parts[0], 10);
let end = parts[1] ? parseInt(parts[1], 10) : start + 999999;
// end 在最后取值为 fileSize - 1
end = end > fileSize - 1 ? fileSize - 1 : end;
let chunksize = (end - start) + 1;
let file = fs.createReadStream(path, { start, end });
let head = {
'Content-Range': `bytes ${start}-${end}/${fileSize}`,
'Accept-Ranges': 'bytes',
'Content-Length': chunksize,
'Content-Type': 'video/mov',
};
res.writeHead(206, head);
console.log('========', end, fileSize);
file.pipe(res);
} else {
let head = {
'Content-Length': fileSize,
'Content-Type': 'video/mov',
};
res.writeHead(200, head);
fs.createReadStream(path).pipe(res);
}
}
});
});
// 启用服务2
server2.listen(3000);
05-15