寒假学习记录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 foundres.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");
})*/

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/682314.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

支付交易——重试服务

摘要 为了能在最大限度满足顾客要求的前提下尽可能降低成本,老王在开店的过程中想了很多方法。这充分体现出老王作为一个商人的特质:不放过一个订单,不浪费一分钱。 老王就这样在自己的生意上兢兢业业多年,想着应该不会有什么纰漏。但现实很…

常见单例模式详解

单例模式是23种设计模式中应用最广的模式之一,其定义:确保某一个类只有一个实例,而且自行实实例化并向整个系统通过这个实例。其类图如下: 通俗来说,单例模式就是用于创建那些在软件系统中独一无二的对象。在一个软件系…

来不及哀悼了,接下来上场的是C语言内存函数memcpy,memmove,memset,memcmp

今天又来写一篇C的文章,这里要讲的是C语言中的几个内存函数,主要是讲解功能和用法,望能耐心观看哦。望官方也多多曝光。 目录 memcpy memmove memset memcmp memcpy memcpy 是 C 语言标准库中的一个函数,用于复制内存块的内容…

rtt设备io框架面向对象学习-dac设备

目录 1.dac设备基类2.dac设备基类的子类3.初始化/构造流程3.1设备驱动层3.2 设备驱动框架层3.3 设备io管理层 4.总结5.使用 1.dac设备基类 此层处于设备驱动框架层。也是抽象类。 在/ components / drivers / include / drivers 下的dac.h定义了如下dac设备基类 struct rt_da…

基于Transformer的机器学习模型的主动学习

主动学习和基于Transformer的机器学习模型的结合为有效地训练深度学习模型提供了强有力的工具。通过利用主动学习,数据科学家能够减少训练模型所需的标记数据的数量,同时仍然达到高精度。本文将探讨基于Transformer的机器学习模型如何在主动学习环境中使…

MySQL数据库⑩_视图+MySQL用户管理(增删查改)

目录 1. 视图的概念和规则限制 2. 视图的基本使用 2.1 创建视图 2.2 修改视图影响基表 2.3 修改基表影响视图 2.4 删除视图 3. MySQL用户管理 3.1 用户信息 3.2 创建用户 3.3 修改用户密码 3.4 删除用户 4. 用户权限 4.1 MySQL权限 4.2 给用户授权 4.3 回收权限…

MongoDB聚合: $redact

$redact阶段可以根据文档本身存储的信息&#xff0c;限制输出整个文档或文档中的内容。 语法 { $redact: <expression> }使用 参数可以是任何有效的表达式&#xff0c;只要能被解析为$$DESCEND、$$PRUNE或 $$KEEP系统变量即可。 $$DESCEND $redact返回当前文档级别的…

Windows Server 2019 DHCP服务器搭建

系列文章目录 目录 系列文章目录 文章目录 前言 一、DHCP服务器是什么&#xff1f; 二、配置服务器 1.实验环境搭建 1)实验服务器配置和客户端 2)实验环境 2.服务器配置 ​编辑 文章目录 Windows Server 2003 Web服务器搭建Windows Server 2003 FTP服务器搭建Windows S…

深度优先搜索、广度优先搜索

搜索 搜索就是采用直接遍历整个状态空间的方式寻找答案的一类算法。根据遍历状态空间&#xff08;图&#xff09;方式的不同&#xff0c;可分为&#xff1a; 深度优先搜索&#xff08;DFS&#xff09; 适合树形状态空间&#xff0c;因为递归本身就会产生树的结构&#xff0c;可…

Leetcode 236.二叉树的最近公共祖先

题目描述 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先。 最近公共祖先的定义为&#xff1a;“对于有根树 T 的两个节点 p、q&#xff0c;最近公共祖先表示为一个节点 x&#xff0c;满足 x 是 p、q 的祖先且 x 的深度尽可能大&#xff08;一个节点也可以是它自己的…

在微信视频号上发表视频

我们手机打开微信 然后 最下面选择 发现 然后点击 上面的视频号 进入后 点击 右上角头像图标 然后 进入个人管理界面 左下角选择 发表视频 然后 进入一个录制界面 我们左下角 点击这个 从相册选择 打开相册后 选择自己需要的视频 然后 点击右下角下一步 觉得内容没问题 就…

Lua编译与运行

lua会首先把代码编译成中间码然后执行&#xff0c;或许大家都有所困惑&#xff1a;它不是解释性语言吗&#xff1f;其实lua作为解释性语言的意义在于其能在运行过程中完成编译工作&#xff0c;正是dofile、loadfile、require这种函数的存在&#xff0c;lua才能顺理成章地称自己…

VUE基础知识(JAVA后端入门篇)

VUE基础知识&#xff08;JAVA后端入门篇&#xff09; Vue是一套前端框架&#xff0c;免除原生JavaScriptr中的DOM操作&#xff0c;简化书写基于MVVM(Model–View-ViewModel)思想&#xff0c;实现数据的双向绑定&#xff0c;将编程的关注点放在数据上Vue.js - 渐进式 JavaScrip…

【python量化交易】qteasy使用教程02 - 获取和管理金融数据

qteasy教程2 - 获取并管理金融数据 qteasy教程2 - 获取并管理金融数据开始前的准备工作获取基础数据以及价格数据下载交易日历和基础数据查看股票和指数的基础数据下载沪市股票数据从本地获取股价数据生成K线图 数据类型的查找定期下载数据到本地回顾总结 qteasy教程2 - 获取并…

基于BitVM的乐观 BTC bridge

1. 引言 前序博客&#xff1a; 区块链互操作协议Bitcoin Bridge&#xff1a;治愈还是诅咒&#xff1f;BitVM&#xff1a;Bitcoin的链下合约 基于BitVM的乐观 BTC bridge&#xff1a; Trust-minimized two-way peg 机制 BitVM BTC bridge背后的主要思想是&#xff1a; 为比…

51单片机编程基础(C语言):电子时钟(LED1602作为显示)

题目要求&#xff1a; 审题时这个题是用数码管来显示的&#xff0c;数码管显示时钟我完成了一个&#xff0c;只是要求跟他不一样&#xff0c;所以这次想用LCD1602来显示&#xff0c;所以我先用LCD1602完成&#xff0c;再用数码管完成&#xff08;其实也只要在我之前的项目基础…

如何学习机器学习和深度学习: 软件工程师指南

一、简介 人工智能这个主题激发了我的兴趣&#xff0c;我一直在这个领域中不断学习和尝试新事物。 众所周知&#xff0c;与自然语言处理、计算机视觉等相关的技术已经出现并发展成为每天被数百万用户使用的解决方案。 尽管人们使用“人工智能”这一术语&#xff0c;但我们离…

[计算机网络]---网络编程套接字

前言 作者&#xff1a;小蜗牛向前冲 名言&#xff1a;我可以接受失败&#xff0c;但我不能接受放弃 如果觉的博主的文章还不错的话&#xff0c;还请点赞&#xff0c;收藏&#xff0c;关注&#x1f440;支持博主。如果发现有问题的地方欢迎❀大家在评论区指正 目录 一、基础知识…

C++ //练习 6.7 编写一个函数,当它第一次被调用时返回0,以后每次被调用返回值加1。

C Primer&#xff08;第5版&#xff09; 练习 6.7 练习 6.7 编写一个函数&#xff0c;当它第一次被调用时返回0&#xff0c;以后每次被调用返回值加1。 环境&#xff1a;Linux Ubuntu&#xff08;云服务器&#xff09; 工具&#xff1a;vim 代码块 /**********************…

如何将字体添加到 ONLYOFFICE 文档服务器 8.0

作者&#xff1a;VincentYoung 阅读本文&#xff0c;了解如何为自己的在线办公软件 ONLYOFFICE 文档服务器的字体库添加字体 ONLYOFFICE 文档是什么 ONLYOFFICE 文档是一个功能强大的文档编辑器&#xff0c;支持处理文本文档、电子表格、演示文稿、可填写表单、PDF 和电子书…