net 模块
回顾 http 请求
- 普通模式
三次响应 请求 响应 四次挥手
- 长链接模式
三次响应
…
请求 响应
请求 响应
请求 响应
…
四次挥手
net 模块能干什么
一个通信模块
- 进程间的通信 IPC
- 网络通信 TCP/IP
创建客户端
http://nodejs.cn/api/net.html#net_net_createconnection_options_connectlistener
net.createConnection(option[, connectListener])
返回一个 socket
- socket 是一个特殊的文件
- 在 node 中表现为一个双工流对象
- 通过向流写入内容发送数据
- 通过监听流的内容获取数据
const net = require("net");
const socket = net.createConnection(
{
host: "duyi.ke.qq.com",
port: 80,
},
() => {
console.log("连接成功");
}
);
// 通过监听流的内容获取数据
socket.on("data", (chunk) => {
var str = chunk.toString("utf-8");
console.log("接收消息:", str);
});
// 通过向流写入内容发送数据
socket.write("1223");
接收消息: HTTP/1.1 400 Bad Request
Server: stgw/1.3.12.4_1.13.5
Date: Wed, 30 Jun 2021 12:57:46 GMT
Content-Type: text/html
Content-Length: 181
Connection: close
<html>
<head><title>400 Bad Request</title></head>
<body bgcolor="white">
<center><h1>400 Bad Request</h1></center>
<hr><center>stgw/1.3.12.4_1.13.5</center>
</body>
</html>
创建服务端
const server = net.createServer();
const net = require("net");
const fs = require("fs");
const path = require("path");
const server = net.createServer();
// 监听端口
server.listen(9527);
server.on("listening", () => {
console.log("监听端口成功");
});
// 浏览器访问 http://127.0.0.1:9527/
server.on("connection", (socket) => {
console.log("有请求进来");
socket.on("data", async (chunk) => {
console.log("客户端写入的数据:", chunk.toString("utf-8"));
// Referer 对应完整路径 可提取路径
// 服务器写入内容 响应
// socket.write('响应内容') // 不符合 http 格式 服务器无法分析
// 响应 文本
// responseText(socket)
// 响应图片
await responseImg(socket);
// 关闭双工流 服务器主动断开链接
socket.end();
});
socket.on("close", () => {
console.log("连接关闭");
});
});
async function responseImg(socket) {
const filename = path.resolve(__dirname, "./xyz.jpg");
// 不能有空格
const headBuffer = Buffer.from(
`HTTP/1.1 200 OK
Content-Type: text/plain;charset=utf-8
`,
"utf-8"
);
const bodyBuffer = await fs.promises.readFile(filename);
const result = Buffer.concat([headBuffer, bodyBuffer]);
socket.write(result);
}
function responseText(socket) {
socket.write(`HTTP/1.1 200 OK
Content-Type: text/plain;charset=utf-8
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="utf-8">
<meta http-equiv="X-UA-Compatible" content="IE=edge">
<meta name="viewport" content="width=device-width,initial-scale=1.0">
<link rel="icon" href="<%= BASE_URL %>favicon.ico">
<title></title>
</head>
<body>
响应内容
</body>
</html>
`);
}