Http模块及练习
### 作业
1. 静态文件服务器
```js
const http = await import('http')
const fs = await import('fs')
const proc = ((req,res)=>{
let file = `./public${req.url}`
let FilePath = file.replace('favicon.ico',"")
// 检查文件是否存在
if (!fs.existsSync(FilePath)) {
res.end('404')
console.log('文件未找到');
return
}
else{
// 读取文件
fs.readFile(FilePath,(err,data)=>{
// 根据文件拓展名设置Content-Type
const ext = FilePath.substring(FilePath.lastIndexOf('.'))
console.log(ext);
switch(ext){
case '.html':
return 'text.html'
case '.css':
return 'text.css'
case '.js':
return 'text.js'
default:
break;
}
// 返回文件内容
res.end(data)
})
}
})
let app = http.createServer(proc)
app.listen(8080)
```
2. 日志记录服务器
```js
const http = await import('http')
const fs = await import('fs')
// 时间戳
const date = Date.now()
let proc = (req,res)=>{
//请求方法
let me = req.method
//请求路径
const path = req.url
//客户端IP地址
const ip = req.headers.host
// 日志文件的格式为:[时间戳] - [请求方法] - [请求路径] - [客户端IP]。
const log = `[${date}]-[${me}]-[${path}]-[${ip}]`
fs.appendFile('./server.log',log,'utf8',(err)=>{
if (err) {
console.log('日志添加失败');
}
else{
fs.readFile('./index.html',(err,data)=>{
if (err) {
console.log('文件没找到');
}
else{
res.end(data)
}
})
}
})
}
let app = http.createServer(proc)
app.listen(5000)
```
3. 图片查看器
```js
const fs = await import('fs')
const http = await import('http')
let proc = function(req,res){
// 请求路径【用户通过访问/view?filename=】
let FilePath = `./images/${req.url.split('?')[1]?.split('=')[1]}`
// 请求的图片存在,返回图片内容
if (fs.existsSync(FilePath)) {
// 读取文件
fs.readFile(FilePath,(err,data)=>{
if (err) {
console.log('读取失败');
}
else{
// 根据文件扩展名判断
const ext = FilePath.substring(FilePath.lastIndexOf('.'))
let contentType = '';
switch (ext) {
case 'jpeg':
contentType = 'image/jpeg';
break;
case 'png':
contentType = 'image/png';
break;
case 'jpg':
contentType = 'image/jpg';
break;
default:
break;
}
// 返回图片内容
res.end(data)
}
})
}
else{
res.end('404')
}
}
let app = http.createServer(proc)
app.listen(4000)
```
4. 文件搜索服务
```js
const http = await import('http')
const fs = await import('fs')
let proc = function(req,res){
let keywords = req.url.split('?')[1]?.split('=')[1]
let FilePath = `.${req.url.split('?')[0]}`; // 获取路径部分
FilePath = FilePath.replace('/search',"")
console.log(FilePath);
// 读取指定目录中的文件列表
fs.readdir(FilePath,(err,files)=>{
if (!err) {
// 遍历文件列表
const SearchFile = files.filter(x=>x.includes(keywords))
// 返回JSON
res.end(JSON.stringify({files:SearchFile}))
}
else{
res.end('404')
}
})
}
let app = http.createServer(proc)
app.listen(8000)
// http://localhost:8000/search?query=example 这样访问
```
5. 简单Web服务
```js
const http = await import('http')
const fs = await import('fs')
const proc = function(req,res){
// 如果路径是 /,则将其视为目录请求
if (req.url == '/') {
// 依次搜索
// 定义顺序
const def = ['index.html','default.html']
// 读取文件内容
switch (true) {
// 检查index
case fs.existsSync(def[0]):
// 读取文件
fs.readFile(def[0],(err,data)=>{
if(err){res.end('404')}
else{
res.end(data)
}
})
break;
case fs.existsSync(def[1]):
fs.readFile(def[1],(err,data)=>{
if(err){res.end('404')}
else{
res.end(data)
}
})
break;
default:
break;
}
}
else{
res.end('404')
}
}
const app = http.createServer(proc)
app.listen(8080)
```
#### Stream(流)
1. 数据按顺序依次流动,不能随机访问。
2. 读写数据:从文件、网络等读取或写入数据。
### Node.js HTTP 服务器和文件服务器开发
1. HTTP 服务器开发
- `request` 对象封装了 HTTP 请求信息。
- `response` 对象用于构建 HTTP 响应并返回给客户端。
2.
```js
// 导入http模块
const http = await import('http')
let proc = function(request,response){
// 将http响应的HTMLneir写进response
console.log(request.url);
response.end('88')
}
let app = http.createServer(proc)
app.listen(8080)
```
- 协议://主机地址:端口号/路径?keywords = 888【】
- 所谓的Web服务器,在不同的语境中有不同含义:它有可能是指如nginx、apache这样托管类的程序,也可能指程序员开发的具有Web服务功能的程序,也有可能是指承载Web程序的物理服务器
- 现代计算机系统,端口号的范围:0 ~ 65535【其中0 ~ 1000是系统保留号】【后面的由用户自己分配】
- 常见的端口号:3306(mysql、MariaDb)、80(web)、22(ssh)、23(ftp)、3389(windows远程桌面)、5432(PostgreSql)
3. 文件服务器开发
- 文件服务器:通过解析 request.url 中的路径,将本地文件内容发送给客户端。
- url 模块:用于解析 URL,提取路径、查询参数等。
- path 模块:用于处理文件路径,确保跨平台兼容性。
- fs 模块:用于读取本地文件系统中的文件。
4. 使用页面html
```js
const http = await import('http')
const fs = await import('fs')
const app = http.createServer(function(req,res){
fs.readFile('index.html','utf8',(err,data)=>{
if (err) {
console.log(err);
}
else{
res.end(data)
}
})
})
app.listen(5000)
```
相关文章:
Http模块及练习
### 作业 1. 静态文件服务器 js const http await import(http) const fs await import(fs) const proc ((req,res)>{ let file ./public${req.url} let FilePath file.replace(favicon.ico,"") // 检查文件是否存在 if (!fs.existsSync(FilePa…...
计算机视觉行业洞察--影像行业系列第一期
计算机视觉行业产业链的上下游构成相对清晰,从基础技术研发到具体应用场景的多个环节相对成熟。 以下是我结合VisionChina经历和行业龙头企业对计算机视觉行业产业链上下游的拆解总结。 上下游总结 上游产业链分为软硬件两类,视觉的硬件主要指芯片、…...
C语言番外篇(3)------------>break、continue
看到我的封面图的时候,部分读者可能认为这和编程有什么关系呢? 实际上这个三个人指的是本篇文章有三个部分组成。 在之前的博客中我们提及到了while循环和for循环,在这里面我们学习了它们的基本语法。今天我们要提及的是关于while循环和for…...
【NLP 31、预训练模型的发展过程】
人的行为,究竟是人所带来的思维方式不同还是与机器一样,刻在脑海里的公式呢? 只是因为不同的人公式不同,所以人的行为才不同,可这又真的是人引以为傲的意识吗? 人脑只是相当于一个大型、驳杂的处理器&#…...
sqlclchery面对复杂的sql语句怎么办
面对复杂的SQL语句时,可以采取以下步骤来简化和解决问题: 理解需求 明确查询的目标,确保清楚需要获取哪些数据。 分解查询 将复杂查询拆分为多个简单部分,逐步构建最终结果。 使用注释 添加注释,解释每个部分的逻辑&…...
C++/JavaScript ⭐算法OJ⭐下一个排列
题目描述 31. Next Permutation A permutation of an array of integers is an arrangement of its members into a sequence or linear order. For example, for arr [1,2,3], the following are all the permutations of arr: [1, 2, 3], [1, 3, 2], [2, 1, 3], [2, 3, 1]…...
《Mycat核心技术》第17章:实现MySQL的读写分离
作者:冰河 星球:http://m6z.cn/6aeFbs 博客:https://binghe.gitcode.host 文章汇总:https://binghe.gitcode.host/md/all/all.html 星球项目地址:https://binghe.gitcode.host/md/zsxq/introduce.html 沉淀,…...
Windows 11 使用容器(Docker Podman)
文章目录 背景1、相关网站1.1、WSL1.2、Docker1.3、Podman 2、环境3、安装部署3.1、安装 WSL3.2、Docker3.2.1、Docker Desktop3.2.1.1、安装3.2.1.2、拉取镜像3.2.1.3、启动容器 3.3、Podman3.3.1、安装3.3.2、使用3.3.3、异常处理 总结 背景 Windows 系统中使用容器…...
代码审计入门学习之sql注入
路由规则 入口文件:index.php <?php // ---------------------------------------------------------------------- // | wuzhicms [ 五指互联网站内容管理系统 ] // | Copyright (c) 2014-2015 http://www.wuzhicms.com All rights reserved. // | Licensed …...
2024信息技术、信息安全、网络安全、数据安全等国家标准合集共125份。
2024信息技术、信息安全、网络安全、数据安全等国家标准合集,共125份。 一、2024信息技术标准(54份) GB_T 17966-2024 信息技术 微处理器系统 浮点运算.pdf GB_T 17969.8-2024 信息技术 对象标识符登记机构操作规程 第8部分:通用…...
element ui的select选择框
我们首先先试一下,这个东西怎么玩的 <el-select v-model"select" change"changeSelect"><el-option value"香蕉"></el-option><el-option value"菠萝"></el-option><el-option value&quo…...
文档检索服务平台
文档检索服务平台是基于Elasticsearch的全文检索,包含数据采集、数据清洗、数据转换、数据检索等模块。 项目地址:Github、国内Gitee 演示地址:http://silianpan.cn/gdss/ 以下是演示角色和账号(密码同账号)…...
使用FastAPI进行可视化部署
文章目录 一、FastAPI介绍二、环境配置三、示例代码1.app.py代码如下2.websocket_handler.py 代码如下3.运行app4.遇到的问题与解决 一、FastAPI介绍 FastAPI是一个高性能的Python Web框架,它基于Starlette并利用了 Python类型提示的优势。它可以帮助我们快速构建具…...
设计模式 之 工厂模式(简单工厂模式、工厂方法模式、抽象工厂模式)(C++)
文章目录 C 工厂模式引言一、简单工厂模式概念实现步骤示例代码优缺点 二、工厂方法模式概念实现步骤示例代码优缺点 三、抽象工厂模式概念实现步骤示例代码优缺点 C 工厂模式 引言 在 C 编程中,对象的创建是一个常见且基础的操作。然而,当项目规模逐渐…...
3、Kubernetes 集群部署 Prometheus 和 Grafana
Kubernetes 集群部署 Prometheus 和 Grafana node-exporter 安装Prometheus 安装和配置Prometheus 配置热加载Grafana 安装部署Grafana 配置 实验环境 控制节点/master01 192.168.110.10 工作节点/node01 192.168.110.20 工作节点/node02 192.168.110.30 node-exporter 安装 #…...
【C语言】第八期——指针
目录 1 初始指针 2 获取变量的地址 3 定义指针变量、取地址、取值 3.1 定义指针变量 3.2 取地址、取值 4 对指针变量进行读写操作 5 指针变量作为函数参数 6 数组与指针 6.1 指针元素指向数组 6.2 指针加减运算(了解) 6.2.1 指针加减具体数字…...
如何在 Mac 上安装并配置 JDK 环境变量
如何在Mac上安装并配置JDK环境变量 在开发过程中,许多应用和框架都需要使用Java,尤其是使用Java开发的应用程序。如果你是Mac用户,以下是安装并配置JDK环境变量的步骤,确保你能顺利运行Java程序。 步骤 1:下载JDK 访…...
【git-hub项目:YOLOs-CPP】本地实现05:项目移植
ok,经过前3个博客,我们实现了项目的跑通。 但是,通常情况下,我们的项目都是需要在其他电脑上也跑通,才对。 然而,经过测试,目前出现了2 个bug。 项目一键下载【⬇️⬇️⬇️】: 精…...
LeetCode 热题 100 206. 反转链表
LeetCode 热题 100 | 206. 反转链表 大家好,今天我们来解决一道经典的算法题——反转链表。这道题在 LeetCode 上被标记为简单难度,要求我们将一个单链表反转,并返回反转后的链表。下面我将详细讲解解题思路,并附上 Python 代码实…...
2025年02月21日Github流行趋势
项目名称:source-sdk-2013 项目地址url:https://github.com/ValveSoftware/source-sdk-2013项目语言:C历史star数:7343今日star数:929项目维护者:JoeLudwig, jorgenpt, narendraumate, sortie, alanedwarde…...
铭豹扩展坞 USB转网口 突然无法识别解决方法
当 USB 转网口扩展坞在一台笔记本上无法识别,但在其他电脑上正常工作时,问题通常出在笔记本自身或其与扩展坞的兼容性上。以下是系统化的定位思路和排查步骤,帮助你快速找到故障原因: 背景: 一个M-pard(铭豹)扩展坞的网卡突然无法识别了,扩展出来的三个USB接口正常。…...
阿里云ACP云计算备考笔记 (5)——弹性伸缩
目录 第一章 概述 第二章 弹性伸缩简介 1、弹性伸缩 2、垂直伸缩 3、优势 4、应用场景 ① 无规律的业务量波动 ② 有规律的业务量波动 ③ 无明显业务量波动 ④ 混合型业务 ⑤ 消息通知 ⑥ 生命周期挂钩 ⑦ 自定义方式 ⑧ 滚的升级 5、使用限制 第三章 主要定义 …...
Vue2 第一节_Vue2上手_插值表达式{{}}_访问数据和修改数据_Vue开发者工具
文章目录 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染2. 插值表达式{{}}3. 访问数据和修改数据4. vue响应式5. Vue开发者工具--方便调试 1.Vue2上手-如何创建一个Vue实例,进行初始化渲染 准备容器引包创建Vue实例 new Vue()指定配置项 ->渲染数据 准备一个容器,例如: …...
Python实现prophet 理论及参数优化
文章目录 Prophet理论及模型参数介绍Python代码完整实现prophet 添加外部数据进行模型优化 之前初步学习prophet的时候,写过一篇简单实现,后期随着对该模型的深入研究,本次记录涉及到prophet 的公式以及参数调优,从公式可以更直观…...
【Java_EE】Spring MVC
目录 Spring Web MVC 编辑注解 RestController RequestMapping RequestParam RequestParam RequestBody PathVariable RequestPart 参数传递 注意事项 编辑参数重命名 RequestParam 编辑编辑传递集合 RequestParam 传递JSON数据 编辑RequestBody …...
MySQL 8.0 OCP 英文题库解析(十三)
Oracle 为庆祝 MySQL 30 周年,截止到 2025.07.31 之前。所有人均可以免费考取原价245美元的MySQL OCP 认证。 从今天开始,将英文题库免费公布出来,并进行解析,帮助大家在一个月之内轻松通过OCP认证。 本期公布试题111~120 试题1…...
零基础设计模式——行为型模式 - 责任链模式
第四部分:行为型模式 - 责任链模式 (Chain of Responsibility Pattern) 欢迎来到行为型模式的学习!行为型模式关注对象之间的职责分配、算法封装和对象间的交互。我们将学习的第一个行为型模式是责任链模式。 核心思想:使多个对象都有机会处…...
实现弹窗随键盘上移居中
实现弹窗随键盘上移的核心思路 在Android中,可以通过监听键盘的显示和隐藏事件,动态调整弹窗的位置。关键点在于获取键盘高度,并计算剩余屏幕空间以重新定位弹窗。 // 在Activity或Fragment中设置键盘监听 val rootView findViewById<V…...
Python 包管理器 uv 介绍
Python 包管理器 uv 全面介绍 uv 是由 Astral(热门工具 Ruff 的开发者)推出的下一代高性能 Python 包管理器和构建工具,用 Rust 编写。它旨在解决传统工具(如 pip、virtualenv、pip-tools)的性能瓶颈,同时…...
蓝桥杯 冶炼金属
原题目链接 🔧 冶炼金属转换率推测题解 📜 原题描述 小蓝有一个神奇的炉子用于将普通金属 O O O 冶炼成为一种特殊金属 X X X。这个炉子有一个属性叫转换率 V V V,是一个正整数,表示每 V V V 个普通金属 O O O 可以冶炼出 …...
