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)

```

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

网络空间安全(2)应用程序安全

前言 应用程序安全(Application Security,简称AppSec)是一个综合性的概念,它涵盖了应用程序从开发到部署,再到后续维护的整个过程中的安全措施。 一、定义与重要性 定义:应用程序安全是指识别和修复应用程序…

【OS安装与使用】part5-ubuntu22.04基于conda安装pytorch+tensorflow

文章目录 一、待解决问题1.1 问题描述1.2 解决方法 二、方法详述2.1 必要说明2.2 应用步骤2.2.1 明确pytorch安装依赖2.2.2 conda创建虚拟环境2.2.3 安装pytorch2.2.4 验证pytorch安装2.2.5 安装Tensorflow2.2.6 验证Tensorflow安装 三、疑问四、总结 一、待解决问题 1.1 问题…

基于Python/Java的医院系统切换互联网医院深度编程对接探索

一、引言 1.1 研究背景与意义 在当今数字化时代,医疗行业的信息化进程不断加速,医院信息系统(Hospital Information System,HIS)作为医疗信息化的核心组成部分,对于提升医院管理效率、优化医疗服务质量起着至关重要的作用。随着互联网技术的飞速发展,互联网医院应运而…

从零开始的网站搭建(以照片/文本/视频信息通信网站为例)

本文面向已经有一些编程基础(会至少一门编程语言,比如python),但是没有搭建过web应用的人群,会写得尽量细致。重点介绍流程和部署云端的步骤,具体javascript代码怎么写之类的,这里不会涉及。 搭…

Linux权限(一)

文章目录 基本指令sudo权限chmod修改目标属性修改角色 修改权限属性目录权限缺省权限 基本指令 sudo 1. sudo是对指令的短暂提权的 2. 比如安装软件,安装到系统中,需要管理员root权限,这些命令其实只安装了一份,普通用户和超级用…

CV -- 基于GPU版CUDA环境+Pycharm YOLOv8 目标检测

目录 下载 CUDA 下载 cuDNN 下载 anaconda 安装 PyTorch pycharm 搭配 yolo 环境并运行 阅读本文须知,需要电脑中有 Nvidia 显卡 下载 CUDA 打开 cmd ,输入 nvidia-smi ,查看电脑支持 CUDA 版本: 我这里是12.0,进入…

R语言安装教程(附安装包)R语言4.3.2版本安装教程

文章目录 前言一、安装包下载二、R-4.3.2安装步骤三、rtools43安装步骤四、RStudio安装步骤 前言 本教程将详细、全面地为你介绍在 Windows 系统下安装 R 语言 4.3.2 的具体步骤。无论你是初涉数据领域的新手,还是希望更新知识体系的专业人士,只要按照本…

springBoot统一响应1.0版本

前言: 通过实践而发现真理,又通过实践而证实真理和发展真理。从感性认识而能动地发展到理性认识,又从理性认识而能动地指导革命实践,改造主观世界和客观世界。实践、认识、再实践、再认识,这种形式,循环往…

【STM32】内存管理

【STM32】内存管理 文章目录 【STM32】内存管理1、内存管理简介疑问:为啥不用标准的 C 库自带的内存管理算法?2、分块式内存管理(掌握)分配方向分配原理释放原理分块内存管理 管理内存情况 3、内存管理使用(掌握&#…

DeepSeek 助力 Vue 开发:打造丝滑的二维码生成(QR Code)

前言:哈喽,大家好,今天给大家分享一篇文章!并提供具体代码帮助大家深入理解,彻底掌握!创作不易,如果能帮助到大家或者给大家一些灵感和启发,欢迎收藏关注哦 💕 目录 Deep…

认知重构 | 自我分化 | 苏格拉底式提问

注:本文为 “认知重构 | 自我分化” 相关文章合辑。 心理学上有一个词叫:认知重构(改变 “非黑即白,一分为二” 的思维方式) 原创 心理师威叔 心理自救 2024 年 10 月 26 日 19:08 广东 你有没有过这样的时候&#x…

YARN的工作机制及特性总结

YARN hadoop的资源管理调度平台(集群)——为用户程序提供运算资源的管理和调度 用户程序:如用户开发的一个MR程序 YARN有两类节点(服务进程): 1. resourcemanager 主节点master ----只需要1个来工作 2. nod…

LLM2CLIP论文学习笔记:强大的语言模型解锁更丰富的视觉表征

1. 写在前面 今天分享的一篇论文《LLM2CLIP: P OWERFUL L ANGUAGE M ODEL U NLOCKS R ICHER V ISUAL R EPRESENTATION》, 2024年9月微软和同济大学的一篇paper, 是多模态领域的一篇工作,主要探索了如何将大模型融合到Clip模型里面来进一步提…

Win11更新系统c盘爆满处理

1.打开磁盘管理 2.右击c盘选择属性,进行磁盘管理,选择详细信息。 3.选择以前安装的文件删除即可释放c盘空间。

Spring面试题2

1、compareable和compactor区别 定义与包位置:Comparable是一个接口,位于java.lang包,需要类去实现接口;而Compactor是一个外部比较器,位于java.util包 用法:Comparable只需要实现int compareTo(T o) 方法,比较当前对…

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…

Django check_password原理

check_password 是 Django 提供的一个用于密码校验的函数,它的工作原理是基于密码哈希算法的特性。 Django 的 make_password 函数在生成密码哈希时,会使用一个随机的 salt(盐值)。这个 salt 会与密码一起进行哈希运算&#xff0…

如何在 SpringBoot 项目创建并使用 Redis 的详细介绍

本文是博主整理项目时整理出来的,项目使用 SpringBoot 框架,使用 Redis 作为缓存组件,用于缓存部分热点接口数据。 文章目录 一、Redis 的前置配置1、引入依赖2、单机配置3、集群配置4、两种配置路径解读 二、创建 Redis 配置类1、简易版 Red…

快速入门——第三方组件element-ui

学习自哔哩哔哩上的“刘老师教编程”,具体学习的网站为:10.第三方组件element-ui_哔哩哔哩_bilibili,以下是看课后做的笔记,仅供参考。 第一节 组件间的传值 组件可以有内部Data提供数据,也可由父组件通过prop方式传…

使用 Grafana 监控 Spring Boot 应用

随着软件开发领域的不断发展,监控和可观测性已成为确保系统可靠性和性能的关键实践。Grafana 是一个功能强大的开源工具,能够为来自各种来源的监控数据提供丰富的可视化功能。在本篇博客中,我们将探讨如何将 Grafana 与 Spring Boot 应用程序…