http请求
- 普通模式
- 长连接模式
net模块
net是一个通信模块
可以实现:
- 进程间的通信 IPC
- 网络通信 TCP/IP
创建客户端
net.createConnection(options[,connectListener])
返回:socekt:
- socket是一个特殊的文件
- 在node中表现为一个双工流对象
- 通过向流写入内容发送数据
- 通过监听流的内容获取数据
js
const net = require("net");
const socket = net.createConnection(
{
host: "duyi.ke.qq.com",
port: 80
},
() => {
console.log("连接成功");
}
);
var recieve = null;
/**
*提炼出响应字符串的消息头和消息体
* @param {*} response
*/
function parseResponse(response) {
const index = response.indexOf("\r\n\r\n");
const head = response.substring(0, index);
const headParts = head.split("\r\n");
const headerArray = headParts.slice(1).map(str => {
return str.split(":").map(s => s.trim());
});
const header = headerArray.reduce((a, b) => {
a[b[0]] = b[1];
return a;
}, {});
const body = response.substring(index).trimStart();
console.log("head", header);
console.log("body", body.substring(0, 100));
}
function isOver() {
// 需要接收的消息体的总字节数
const contentLength = receive.head["Content-Length"];
const curReceivedLength = Buffer.from(receive.body, "utf-8").byteLength;
console.log("contentLength:", curReceivedLength);
return curReceivedLength > contentLength;
}
socket.on("data", chunk => {
const response = chunk.toString("utf-8");
if (!receive) {
//第一次
receive = parseResponse(response);
if (isOver()) {
socket.end();
}
return;
}
receive.body += response;
if(isOver()) {
sockert.end();
return;
}
});
//socket.write{`请求行
//请求头
//
//请求体`);
socket.write(`GET / HTTP/1.1
Host: duyi.ke.qq.com
Connection: keep-alive
`);
socket.on("close", () => {
console.log("结束了!");
});
创建服务器
net.createServer()
返回server对象
server.listen(port)
- 启动服务器并监听指定的端口号
port
。 - 服务器开始等待来自客户端的连接。
server.on("listen",()=>{})
- 监听
listen
事件,当服务器成功启动并开始监听端口时触发。 - 可以在此回调函数中执行一些初始化操作,例如打印日志。
server.on("connection",socket=>{})
- 当某个连接到来时,触发该事件
- 监听
connection
事件,当有客户端连接到服务器时触发。 - 事件的监听会获得一个socket对象
示例:
js
const net = require("net");
// 创建 TCP 服务器
const server = net.createServer();
// 监听指定端口
const port = 3000;
server.listen(port);
// 监听 "listen" 事件
server.on("listen", () => {
console.log(`服务器已启动,正在监听端口 ${port}`);
});
// 监听 "connection" 事件
server.on("connection", socket => {
console.log("有客户端连接:", socket.remoteAddress, socket.remotePort);
// 监听客户端发送的数据
socket.on("data", data => {
console.log("接收到客户端数据:", data.toString());
socket.write("服务器已收到数据"); // 向客户端发送响应
});
// 监听客户端断开连接
socket.on("close", () => {
console.log("客户端已断开连接");
});
// 监听错误
socket.on("error", err => {
console.error("连接出错:", err);
});
});
// 监听服务器错误
server.on("error", err => {
console.error("服务器出错:", err);
});