寒假学习记录15:Node(网络)

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");
})*/

相关推荐

  1. 寒假学习记录15Node网络

    2024-02-14 23:52:01       50 阅读
  2. 寒假学习记录16:Express框架(Node

    2024-02-14 23:52:01       59 阅读
  3. 2024.2.1 寒假训练记录15

    2024-02-14 23:52:01       56 阅读
  4. 2024.2.15 寒假训练记录(24)

    2024-02-14 23:52:01       48 阅读
  5. 2024.1.28 寒假训练记录11

    2024-02-14 23:52:01       70 阅读
  6. 寒假 14

    2024-02-14 23:52:01       50 阅读
  7. 嵌入式学习记录15

    2024-02-14 23:52:01       46 阅读

最近更新

  1. docker php8.1+nginx base 镜像 dockerfile 配置

    2024-02-14 23:52:01       94 阅读
  2. Could not load dynamic library ‘cudart64_100.dll‘

    2024-02-14 23:52:01       100 阅读
  3. 在Django里面运行非项目文件

    2024-02-14 23:52:01       82 阅读
  4. Python语言-面向对象

    2024-02-14 23:52:01       91 阅读

热门阅读

  1. 时间序列预测——BiLSTM模型

    2024-02-14 23:52:01       42 阅读
  2. 动态线程池可以这样实现,便于上线及时调整!

    2024-02-14 23:52:01       39 阅读
  3. 利用Cloudfare worker反代github

    2024-02-14 23:52:01       54 阅读
  4. Python weather app tutorial

    2024-02-14 23:52:01       35 阅读
  5. 简单的手指控制机械臂

    2024-02-14 23:52:01       65 阅读
  6. 数据分析 — Pandas 数据处理

    2024-02-14 23:52:01       43 阅读
  7. Sublime Text 常用快捷键简介

    2024-02-14 23:52:01       50 阅读
  8. 飞机大作战(c语言)

    2024-02-14 23:52:01       50 阅读