node 之 http模块

1.什么是http模块

在网络节点中,负责消费资源的电脑叫做客户端;负责对外提供网络资源的电脑,叫做服务器

http模块是node.js官方提供的,用来创建web服务器的模块,通过http模块提供的http.createServer()方法,就能方便的把一台普通的电脑,变成一台web服务器,从而对外提供web资源服务。

服务器和普通电脑的区别在于,服务器上安装了web服务器软件,例如IIs,Apache等。通过安装这些服务器软件,就能把一台普通电脑变成一台web服务器

在node.js中,我们不需要使用IIs,Apache等这些第三方web服务器软件,因为我们可以基于node.js提供的http模块,通过几行简单的代码,就能手写一个服务器软件,从而对对外提供web服务,从而对外提供web服务

2.使用http模块创建web服务器需要先导入

const http = require('http')

3.服务器相关的概念

IP地址

IP 地址就是互联网上每台计算机的唯一地址,因此IP地址具有唯一性。如果把"个人电脑”比作"一台电话”,那么“IP地址”就相当于“电话号码”,只有在知道对方P 地址的前提下,才能与对应的电脑之间进行数据通信。
IP 地址的格式:通常用“点分+进制”表示成(a.b.c.d)的形式,其中,ab,cd 都是0~255 之间的十进制整数。例如:用点分十进表示的 IP地址 (192.168.1.1)
注意:
1️⃣互联网中每台 Web 服务器,都有自己的IP 地址,例如:大家可以在 Windows 的终端中运行 ping www.baidu.com 命
令,即可查看到百度服务器的 IP 地址。
2️⃣在开发期间,自己的电脑既是一台服务器,也是一个客户端,为了方便测试,可以在自己的浏览器中输入127.0.0.1这个IP 地址,就能把自己的电脑当做一台服务器进行访问了。

域名和域名服务器

尽管IP 地址能够唯一地标记网络上的计算机,但IP地址是一长串数字,不直观,而且不便于记忆,于是人们又发明了另一套字符型的地址方案,即所谓的域名(Domain Name)地址IP地址和域名是一一对应的关系,这份对应关系存放在一种叫做域名服务器(DNS,Domain name server)的电脑中。使用者只需通过好记的域名访问对应的服务器即可,对应的转换工作由域名服务器实现。因此,域名服务器就是提供IP地址和域名之间的转换服务的服务器
注意:
1️⃣单纯使用IP 地址,互联网中的电脑也能够正常工作。但是有了域名的加持,能让互联网的世界变得更加方便
2️⃣在开发测试期间,127.0.0.1对应的域名是localhost,都代表我们自己的这台电脑,在使用效果上没有任何区别

端口号
在这里插入图片描述

计算机中的端口号,就好像是现实生活中的门牌号一样。通过门牌号,外卖小哥可以在整栋大楼众多的房间中,准确把外卖送到你的手中。
同样的道理,在一台电脑中,可以运行成百上千个web 服务。每个 web 服务都对应一个唯一的端口号。客户端发送过来的网络请求,通过端口号,可以被准确地交给对应的 web 服务进行处理。
注意:
1️⃣每个端口号不能同时被多个web服务占用
2️⃣在实际应用中,url中的80端口可以被省略

4.创建最基本的web服务器

创建web服务器的基本步骤
1️⃣导入http模块

const http = require('http')

2️⃣创建web服务器实例

const server = http.createServer()

3️⃣为服务器实例绑定request事件,监听客户端的请求

//使用服务器实例.on()方法,为服务器绑定一个request事件
server.on('request', (req, res) => {
//只要有客户端来请求我们自己的服务器,就会触发request事件,从而调用这个事件处理函数console.log('Someone visit our web server.')
})

4️⃣启动服务器

// 调用server.listen(端口号,cb回调)方法,即可启动web服务器
server.listen(8080, function () {  console.log('server running at http://127.0.0.1:8080')
})

5.req请求对象

const http = require('http')
const server = http.createServer()
// req 是请求对象,包含了与客户端相关的数据和属性
server.on('request', (req, res) => {// req.url 是客户端请求的 URL 地址const url = req.url// req.method 是客户端请求的 method 类型const method = req.methodconst str = `Your request url is ${url}, and request method is ${method}`console.log(str)// 调用 res.end() 方法,向客户端响应一些内容res.end(str)
})
server.listen(80, () => {console.log('server running at http://127.0.0.1')
})

6.res响应对象

// req 是请求对象,包含了与客户端相关的数据和属性
server.on('request', (req, res) => {// req.url 是客户端请求的 URL 地址const url = req.url// req.method 是客户端请求的 method 类型const method = req.methodconst str = `Your request url is ${url}, and request method is ${method}`// 调用 res.end() 方法,向客户端响应一些内容res.end(str)
})

7.解决中文乱码的问题

const http = require('http')
const server = http.createServer()server.on('request', (req, res) => {// 定义一个字符串,包含中文的内容const str = `您请求的 URL 地址是 ${req.url},请求的 method 类型为 ${req.method}`// 调用 res.setHeader() 方法,设置 Content-Type 响应头,解决中文乱码的问题res.setHeader('Content-Type', 'text/html; charset=utf-8')// res.end() 将内容响应给客户端res.end(str)
})server.listen(80, () => {console.log('server running at http://127.0.0.1')
})

8.根据不同的url响应不同的html内容

核心实现步骤
1️⃣获取请求的url地址
2️⃣设置默认的响应内容为404Not found
3️⃣判断用户请求是否为/或/index.html首页
4️⃣判断用户请求的是否为/about.html关于页面
5️⃣设置Content-Type响应头,防止中文乱码
6️⃣使用res.end()把内容响应给客户端

const http = require('http')
const server = http.createServer()server.on('request', (req, res) => {// 1. 获取请求的 url 地址const url = req.url// 2. 设置默认的响应内容为 404 Not foundlet content = '<h1>404 Not found!</h1>'// 3. 判断用户请求的是否为 / 或 /index.html 首页// 4. 判断用户请求的是否为 /about.html 关于页面if (url === '/' || url === '/index.html') {content = '<h1>首页</h1>'} else if (url === '/about.html') {content = '<h1>关于页面</h1>'}// 5. 设置 Content-Type 响应头,防止中文乱码res.setHeader('Content-Type', 'text/html; charset=utf-8')// 6. 使用 res.end() 把内容响应给客户端res.end(content)
})server.listen(80, () => {console.log('server running at http://127.0.0.1')
})

9.实现clock时钟的web服务器

核心思路
把文件的实际存放路径,作为每个资源的请求url地址
在这里插入图片描述
实现步骤
1️⃣导入需要的模块
2️⃣创建基本的web服务器
3️⃣将资源的请求url地址映射为文件的存放路径
4️⃣读取文件内容并响应给客户端
5️⃣优化资源的请求路径

// 1.1 导入 http 模块
const http = require('http')
// 1.2 导入 fs 模块
const fs = require('fs')
// 1.3 导入 path 模块
const path = require('path')// 2.1 创建 web 服务器
const server = http.createServer()
// 2.2 监听 web 服务器的 request 事件
server.on('request', (req, res) => {// 3.1 获取到客户端请求的 URL 地址//     /clock/index.html//     /clock/index.css//     /clock/index.jsconst url = req.url// 3.2 把请求的 URL 地址映射为具体文件的存放路径// const fpath = path.join(__dirname, url)// 5.1 预定义一个空白的文件存放路径let fpath = ''if (url === '/') {fpath = path.join(__dirname, './clock/index.html')} else {//     /index.html//     /index.css//     /index.jsfpath = path.join(__dirname, '/clock', url)}// 4.1 根据“映射”过来的文件路径读取文件的内容fs.readFile(fpath, 'utf8', (err, dataStr) => {// 4.2 读取失败,向客户端响应固定的“错误消息”if (err) return res.end('404 Not found.')// 4.3 读取成功,将读取成功的内容,响应给客户端res.end(dataStr)})
})
// 2.3 启动服务器
server.listen(80, () => {console.log('server running at http://127.0.0.1')
})

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

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

相关文章

力扣哈希表篇

以下解题思路来自代码随想录以及力扣官方 文章目录 242.有效的字母异位词349.两个数组的交集202.快乐数1.两数之和15.三数之和 242.有效的字母异位词 给定两个字符串 s 和 t &#xff0c;编写一个函数来判断 t 是否是s 的字母异位词。 输入: s "anagram", t &qu…

数仓开发环境链接

这里写目录标题 1开发工具链接大数据组件1.1 启动hiveserver21.2配置DataGrip连接1.3测试使用 2 环境问题排查思路 1开发工具链接大数据组件 1.1 启动hiveserver2 数仓开发工具datagrip 需要用到JDBC协议链接到Hive&#xff0c;需要启动hiveserver2。 cd /opt/module/hive h…

Vue项目中,src目录下的vue.app文件介绍

在 Vue 项目中&#xff0c;src 文件夹通常包含了项目的核心代码。在这个文件夹下&#xff0c;App.vue 是一个特殊的文件&#xff0c;它代表了整个 Vue 应用的根组件。 App.vue 是一个单文件组件&#xff08;Single File Component, 简称 SFC&#xff09;&#xff0c;它允许你将…

c语言day4 运算符 表达式 三大控制结构

1&#xff1a; 2&#xff1a; 输入一个年月日 计算这是这一年的第几天 17 int year,month,day;18 printf("请输入年份 月份 日期");19 scanf("%d %d %d",&year,&month,&day);20 int feb28;21 if(year%40&&year%1…

周鸿祎首堂免费课与千万网友分享“AGI趋势”

“我讲课不割韭菜&#xff0c;宗旨是免费、分享、科普、交流。AI时代技术发展迅速&#xff0c;AI知识普及尤为重要。”2月29日&#xff0c;360公司创始人周鸿祎免费课正式开启&#xff0c;全网多平台直播了AI系列第一讲“预见AGI”&#xff0c;千万网友观看。免费课上&#xff…

BUUCTF crypto做题记录(11)新手向

一、[HDCTF2019]bbbbbbrsa 题目所给的信息我汇总到以下代码中 from base64 import b64encode as b32encode from gmpy2 import invert,gcd,iroot from Crypto.Util.number import * from binascii import a2b_hex,b2a_hex import randomflag "************************…

[Flutter]倒计时和计时器

1.延迟执行 Future.delayed 使用Future.delayed可以在延迟一定时间后执行代码。这是实现延迟执行最简单的方式之一。 Future.delayed(Duration(seconds: 1), () {// 这里的代码会在1秒后执行print(This message is displayed after 1 second.); }); Timer Timer类提供了更…

20240227-Python Tkinter学习笔记

文章目录 Label标签Label标签和Button按钮Listbox列表Radiobutton单选按钮Scale滑动条Checkbutton多选框Canvas画布Menubar 菜单Frame框架Messagebox弹窗pack/grid/place 布局方式登录注册案例 Label标签 import tkinter as tk # 导入tkinter模块&#xff0c;并简写为tk# 创建…

mysql数据库安装与使用(一)

目录 前言 一&#xff0c;安装mysql数据库 二&#xff0c;mysql数据库使用 连接mysql数据库 创建数据库 创建表格 插入数据 查询数据 更新数据 删除数据 关闭连接 使用数据库 查看所有数据库 查看数据库中的表 三&#xff0c;mysql设置 创建用户 授予权限 刷新权…

全量知识系统问题及SmartChat给出的答复 之3

Q8. 进一步&#xff0c;请展示如何使用这些技术来衡量、评估或适应不可避免的不匹配的知识汤问题的更进一步的全面代码。 为了处理不可避免的不匹配的知识汤问题&#xff0c;我们可以引入一些技术方法来衡量、评估或适应这种情况。 下是一个更进一步的全面代码示例&#xff0…

代码随想录算法训练营Day30|332.重新安排行程、51. N皇后、37. 解数独

332.重新安排行程 题目链接&#xff1a;332.重新安排行程 文档链接&#xff1a;332.重新安排行程 C实现 class Solution { private:unordered_map<string,map<string,int>> targets;bool backtracking(int ticketNum, vector<string>& result) {if(resu…

怎么制作文件类型二维码?文件二维码如何加密?

现在将文件转二维码图片后&#xff0c;分享生成二维码来扫码查看或者下载文件的方式&#xff0c;在很多的场景中都有应用。这个方法的优势在于&#xff0c;成本低而且安全性高&#xff0c;有利于用户快速获取内容的速度&#xff0c;有效提高用户体验&#xff0c;而且日常使用的…

【Kubernetes】服务(Service)是什么?有什么用?有哪些类型?

系列文章目录 K8s中的Namespace是什么&#xff1f; Kubernetes 集群的组件介绍 Kubernetes 对象是什么&#xff1f; Pod——k8s中最重要的对象之一 Kubernetes 和 Docker 之间有什么区别&#xff1f; 部署安装 K8s 为什么要关闭 swap 分区&#xff1f; k8s中容器之间、pod之间…

ZABBIX修改web界面的 “支持“,“帮助”,“Integrations“。等菜单按钮,百试百灵,删除修改Help,Support菜单

♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ ♥ **ZABBIX修改web界面的 “支持”&#xff0c;“帮助”,“Integrations”。等菜单按钮&#xff0c…

基于 Transformer 的中文对联生成器

✅作者简介&#xff1a;人工智能专业本科在读&#xff0c;喜欢计算机与编程&#xff0c;写博客记录自己的学习历程。 &#x1f34e;个人主页&#xff1a;小嗷犬的个人主页 &#x1f34a;个人网站&#xff1a;小嗷犬的技术小站 &#x1f96d;个人信条&#xff1a;为天地立心&…

javaWeb学习04

AOP核心概念: 连接点: JoinPoint, 可以被AOP控制的方法 通知: Advice 指哪些重复的逻辑&#xff0c;也就是共性功能(最终体现为一个方法) 切入点: PointCut, 匹配连接点的条件&#xff0c;通知仅会在切入点方法执行时被应用 目标对象: Target, 通知所应用的对象 通知类…

模糊PID控制算法实战讲解-案例温度控制(附C语言实现)

可结合之前的文章一起理解&#xff1a; 控制算法-PID算法总结-从公式原理到参数整定解析&#xff08;附C源码&#xff09;_pid自整定算法-CSDN博客 模糊控制算法实战讲解-案例温度控制&#xff08;附C语言实现&#xff09;-CSDN博客 目录 一、模糊PID控制的原理 1.1 模糊化…

边读 Emacs Lisp Intro 边做题(五)

文章目录 边读Emacs Lisp Intro边做题&#xff08;五&#xff09; 边读Emacs Lisp Intro边做题&#xff08;五&#xff09; 打开emacs&#xff0c;按C-h i打开Info页&#xff0c;找到Emacs Lisp Intro。 这里的\\b\\([^ \n\t]\\)[ \n\t]\\1\\b抄自题目描述中提供的链接&#…

Decision Transformer

DT个人理解 emmm, 这里的Transformer 就和最近接触到的whisper一样,比起传统Transformer,自己还设计了针对特殊情况的tokens。比如whisper里对SOT,起始时间,语言种类等都指定了特殊tokens去做Decoder的输入和输出。 DT这里的作为输入的Tokens由RL里喜闻乐见的历史数据:…

Java优先级队列--堆

目录 1. 优先级队列 1.1 概念 2.优先级队列的模拟实现 2.1 堆的概念 2.2 堆的存储方式 2.3 堆的创建 2.3.1 堆向下调整 2.3.2 堆的创建 2.3.3 建堆的时间复杂度 2.4 堆的插入与删除 2.4.1 堆的插入 2.4.2 堆的删除 2.5 用堆模拟实现优先级队列 3.常用接口介绍 3…