net模块 (TCP/IP协议)
创建客户端
1.引入net
const net = require("net");
2.创建客户端
const socket = net.createConnection(
{
host:"连接地址的路径",
port:80(端口号)
},
()=>{
console.log("连接成功");
}
)
3.发送请求
如果不发送请求是得不到响应的
socket.write("你好")//这个不是http格式的请求
http格式的请求写法
socket.write(`GET / HTTP/1.1
Host: "访问的主机名或ip地址"
Connection: keep-alive
`)
格式: 请求行:请求方法 请求路径 协议+版本
请求头:...
请求体:... 没有的话就空两行(不空两行会一直等待请求体)
4.获得数据时
socket.on("data",chunk=>{
console.log("来自服务器的消息", chunk.toString("utf-8"));//二进制转utf-8
})
5.监听挂断时
socket.on("close",()=>{
console.log("结束");
})
6.结束请求
//socket.on("data",chunk=>{
//console.log("来自服务器的消息", chunk.toString("utf-8"));
socket.end();
//})
这里会截断数据,具体的处理方法不作说明,仅用于了解概念
创建服务器
1.引入net
const net = require("net");
2.创建服务器
const server = net.createServer();
3.监听端口号
server.listen(8001);
4.监听端口时(写点监听成功提示)
server.on("listening",()=>{
console.log("服务器创建成功,监听8001端口")
})
5.监听客户连接时(等待客户连接)
server.on("connection", socket=>{
console.log("有客户端连接到服务器")
})
6.发送数据并断开连接
//server.on("connection", socket=>{
//console.log("有客户端连接到服务器")
socket.on("data",chunk=>{
console.log(chunk.toString("utf-8"));
socket.write(`HTTP/1.1 200 OK
这里写数据
`);
socket.end();
})
//})
7.服务器断开时
//server.on("connection", socket=>{
//console.log("有客户端连接到服务器")
//socket.on("data",chunk=>{
//console.log(chunk.toString("utf-8"));
//socket.write(`HTTP/1.1 200 OK
//这里写数据
//`);
//socket.end();
//})
socket.on("end",()=>{
console.log("连接关闭了")
})
//})
http模块 (http协议)
客户端
请求:ClientRequest对象
响应:IncomingMessage对象
服务器
请求:IncomingMessage对象
响应:ServerResponse对象
作为客户端发送请求
const http = require("http"); //引入http模块
const request = http.request(
"请求路径", //请求路径
{
method:"GET", //请求方式
},
resp => {
console.log("服务器响应的状态码",resp.statusCode);
console.log("服务器响应头",resp.headers);
let result = "";
resp.on("data",chunk => {
result += chunk.toString("utf-8"); //二进制转utf-8
});
resp.on("end",() => { //结束时输出结果
console.log(JSON.parse(result));
})
}
)
//request.write(); //由于get请求没有响应体,所以不用写write()
request.end(); //告诉服务器结束请求,要不然会一直等待
作为服务器发送响应
const http = require("http");//引入http模块
function handleReq(req){
console.log("有请求来了!");
const urlobj = req.url; //获取请求路径
console.log("请求路径",urlobj);
console.log("请求方式",req.method); //获取请求方式
console.log("请求头",req.headers); //获取请求头
let body = "";
req.on("data",chunk=>{
body += chunk.toString("utf-8"); //处理请求体
})
req.on("end",()=>{
console.log("请求体", body); //显示请求体
})
}
const server = http.createServer((req,res)=>{
handleReq(req); //封装函数
res.setHeader("a","1"); //发送响应头
res.setHeader("b","2");
res.statusCode = 404; //发送响应码
res.write("你好!"); //发送响应体(body)
res.end(); //结束发送响应
})
server.listen(8001); //监听端口号
server.on("listening",()=>{
console.log("server listen 8001"); //启动提示
})
静态资源服务器小案例
//静态资源服务器
//创建一个public文件夹,里面就存静态资源
// http://localhost:9527/index.html ->
//当请求这个地址的时候,服务器传public/index.html 文件内容
// http://localhost:9527/css/index.css ->
//当请求这个地址的时候,服务器传public/css/index.css文件内容
const http = require("http"); //第一步:导入http模块
const URL = require("url");
const path = require("path");
const fs = require("fs");
async function getStat(filename){ //判断一下是否有这个路径 //第六步
try{
return await fs.promises.state(filename); //有则返回文件状态
} catch {
return null; //没有则返回null
}
}
async function getFileInfo(url){ //获得请求路径(得到要处理的文件路径) //第五步
const urlObj = URL.parse(url); //这个方法弃用了(暂时用这个方法做案例)
//这里是拿到http://localhost:9527/index.html的index.html路径
//只需要在前面拼上public即可转成绝对路径
let filename; //要处理的文件路径
filename = path.resolve(__dirname,"public",urlObj.pathname.substring(1));//截取掉第一个/斜杠
const stat = await getStat(filename); //获取文件状态(就是有没有这个文件)
if (!stat) { //如果文件不存在
return null;
} else if (stat.isDirectory()/*如果时一个目录的话*/) { //如果文件时一个目录,不是以恶搞文件(就是如果是文件夹的话)
filename = path.resolve(__dirname , "public" , urlObj.pathname.substring(1) , "index.html" ); //可以给一个默认路径
//上述为给他加个默认主文件,如果该文件没有就继续进行处理
//这段代码主要是用于当输入一个/时可以直接跳到主页面,主页面有时不需要写全路径
stat = await getStat(filename);//二次判断
if (!stat) {
return null;
} else {
//如果存在文件的话返回文件
return await fs.promises.readFile(filename);
}
} else {
//如果文件存在的话
return await fs.promises.readFile(filename);
}
}
async function handleReq(req){ //请求处理函数 //第四步
const info = await getFileInfo(req.url);
if (info) {
res.write(info)//存在就响应文件
} else { //如果info为null,返回404 not found
res.statusCode = 404;
res.write("资源不存在")
}
}
async function handleRes(res){ //响应处理函数 //第四步
res.write("你好");
res.end();
}
const server = http.createServer((req,res)=>{ //第二步,创建一个服务器
handleReq(req);
handleRes(res);
})
server.listen(6000); //监听6000端口 //第三步
server.on("listening",()=>{ //监听提示 //第三步
console.log("server listen 6000");
})
https模块 (https协议)
https保证数据在传输过程不被窃取和篡改,从而保证传输安全
http转https
const https = require("https"); //这里引入https协议
/*const URL = require("url");
const path = require("path");
const fs = require("fs");
async function getStat(filename){
try{
return await fs.promises.state(filename);
} catch {
return null;
}
}
async function getFileInfo(url){
const urlObj = URL.parse(url);
let filename;
filename = path.resolve(__dirname,"public",urlObj.pathname.substring(1));
const stat = await getStat(filename);
if (!stat) {
return null;
} else if (stat.isDirectory()) {
filename = path.resolve(__dirname , "public" , urlObj.pathname.substring(1) , "index.html" );
stat = await getStat(filename);
if (!stat) {
return null;
} else {
return await fs.promises.readFile(filename);
}
} else {
return await fs.promises.readFile(filename);
}
}
async function handleReq(req){
const info = await getFileInfo(req.url);
if (info) {
res.write(info)
} else {
res.statusCode = 404;
res.write("资源不存在")
}
}
async function handleRes(res){
res.write("你好");
res.end();
}
*/
const server = https.createServer(
{
key: fs.readFileSync(path.resolve(__dirname,"私钥路径")),//私钥
cert: fs.readFileSync(path.resolve(__dirname,"服务器证书路径"))
},
(req,res)=>{ //改动这里
handleReq(req);
handleRes(res);
}
)
/*
server.listen(6000);
server.on("listening",()=>{
console.log("server listen 6000");
})*/