一、net模块
1.http请求
1.普通模式
2.长连接模式
2.net模块作用
net是一个通信模块,利用它可以实现1. 进程间的通信。2. 网络通信TCP/IP
3.创建客户端
net.createConnection(options[, connectListener])
const net = require("net");
const socket = net.createConnection({
host: 'duyi.ke.qq.com',
port: 80
},()=>{
console.log("连接成功!");
});
返回:socket
socket是一个特殊的文件,在node中表现为一个双工流对象
通过向流写入内容发送数据,通过监听流的内容获取数据
const net = require("net");
const socket = net.createConnection({
host: 'duyi.ke.qq.com',
port: 80
},()=>{
console.log("连接成功!");
});
socket.on("data",chunk=>{
console.log("来自服务器的消息:",chunk.toString("utf-8"));
});
socket.write("hello!");
因为发送的hello不是一个正确的格式,所以服务器无法识别。返回400
socket.write(`GET / HTTP/1.1
Host: duyi.ke.qq.com
Connection: keep-alive
`);//格式一定要一一对应!!!
4.创建服务器
const net = require("net");
const server = net.createServer();
server.listen(9527);//监听当前计算机中某个端口
server.on("listening",()=>{ //开始监听端口后触发的事件
console.log("server listen 9527");
});
server.on("connection",()=>{ //当某个连接到来时,触发该事件
console.log("有客户端连接到服务器");
});
当我访问本地:9527时就会触发connection事件了。
//当某个连接到来时,触发该事件
server.on("connection",socket=>{
console.log("有客户端连接到服务器");
socket.on("data",chunk=>{//事件的监听函数会获得一个socket对象
console.log(chunk.toString("utf-8"));
socket.write("hello!");//由于hello格式错误,所以无法返回。
socket.end();
});
socket.on("end",()=>{
console.log("连接关闭了");
});
});
server.on("connection",socket=>{
console.log("有客户端连接到服务器");
socket.on("data",chunk=>{
console.log(chunk.toString("utf-8"));
socket.write(`HTTP/1.1 200 OK
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<title>Document</title>
</head>
<body>
<h1>hello!</h1>
</body>
</html>`);
socket.end();
});
socket.on("end",()=>{
console.log("连接关闭了");
});
});
使用这样的格式才是服务器需要的返回格式(两换行符之间一定不能有空格等!!!!)。
const net = require("net");
const server = net.createServer();
const fs = require("fs");
const path = require("path");
server.listen(9527); // 服务器监听9527端口
server.on("listening", () => {
console.log("server listen 9527");
});
server.on("connection", socket => {
console.log("有客户端连接到服务器");
socket.on("data", async chunk => {
const filename = path.resolve(__dirname, "./hsq.jpg");
const bodyBuffer = await fs.promises.readFile(filename);
const headBuffer = Buffer.from(`HTTP/1.1 200 OK
Content-Type: image/jpeg //返回数据的类型
`,
"utf-8"
);
const result = Buffer.concat([headBuffer, bodyBuffer]);
socket.write(result);
socket.end();
});
socket.on("end", () => {
console.log("连接关闭了");
});
});
socket对象:
可能存在多个客户端连接9527端口,每个连接都会产生新的socket。