【Node.js入门笔记10---http 模块】
Node.js入门笔记10
- Node.js---http 模块
- 一、核心功能
- 0.学习http的前提
- 1. 创建 HTTP 服务器
- 2. 处理请求和响应
- 二、进阶用法
- 1. 路由管理
- 2. 处理 POST 请求
- 3. 中间件模式
- 三、常见场景
- 四、错误处理与安全
- 五、对比 http 与 Express
- 六、工具库推荐:
Node.js—http 模块
什么是客户端、什么是服务器?
在网络节点中,负责消费资源的电脑,叫做客户端;负责对外提供网络资源的电脑,叫做服务器
http 模块是 Node.js 官方提供的、用来创建 web 服务器的模块。用于创建 HTTP 服务器和客户端。http 模块是 Node.js 官方提供的、用来创建 web 服务器的模块。通过 http 模块提供的 http.createServer0 方法,就能方便的把一台普通的电脑,变成一台 Web 服务器,从而对外提供 Web 资源服务。
一、核心功能
0.学习http的前提
-
IP 地址:是互联网上每台计算机的唯一地址,因此IP 地址具有唯一性。如果把“个人电脑”比作"一台电话”,那么"IP地址”就相当于“电话号码”,只有在知道对方IP 地址的前提下,才能与对应的电脑之间进行数据通信。
IP 地址的格式:通常用“点分十进制”表示成(a.b.c.d)的形式,其中,a,b,c,d 都是 0~255 之间的十进制整数。例如:用点分十进表示的IP地址(192.168.1.1)
互联网中每台 Web 服务器,都有自己的 IP 地址,例如:大家可以在 Windows 的终端中运行 ping www.baidu.com 命令,即可查看到百度服务器的IP 地址。
在开发期间,自己的电脑既是一台服务器,也是一个客户端,为了方便测试,可以在自己的浏览器中输入 127.0.0.1 这个IP 地址,就能把自己的电脑当做一服务器进行访问了。
-
域名和域名服务器:尽管 IP地址能够唯一地标记网络上的计算机,但!P地址是一长串数字,不直观,而且不便于记忆,于是人们又发明了另一套字符型的地址方案,即所谓的域名(Domain Name)地址。IP地址和域名是–对应的关系,这份对应关系存放在一种叫做域名服务器(DNS,Domain name server)的电脑中。使用者只需通过好记的域名访问对应的服务器即可,对应的转换工作由域名服务器实现。因此,域名服务器就是提供IP 地址和域名之间的转换服务的服务器。
在开发测试期间,127.0.01对应的域名是localhost,它们都代表我们自己的这台电脑,在使用效果上没有任何区别。
-
端口号:在一台电脑中,可以运行成百上千个 web服务。每个 web 服务都对应一个唯一的端口号。客户端发送过来的网络请求,通过端口号,可以被准确地交给对应的 web 服务进行处理。每个端口号不能同时被多个 web 服务占用。在实际应用中,URL 中的 80 端口可以被省略,(80 443 3006 )
如果要在 JavaScript 代码中,使用 http模块来操作文件,则需要使用如下的方式先导入它:
const http = require('http');
1. 创建 HTTP 服务器
语法格式:
// 1.导入 http 模块
const http = require('http');// 2.创建 HTTP 服务器
const server = http.createServer((req, res) => {// 处理请求和响应// 设置响应头res.writeHead(200, { 'Content-Type': 'text/plain' }); // 状态码 200,文本类型// 发送响应数据res.end('Hello World1');
});// 3.监听端口
// listen 方法用于启动服务器并监听指定的端口(这里是 3000)。
// 第一个参数是要监听的端口号。
// 第二个参数是一个可选的回调函数,当服务器成功启动并开始监听端口时,这个回调函数会被调用。
// 在这个例子中,回调函数只是在控制台输出一条消息,提示服务器已经在 http://localhost:3000 上运行。
server.listen(3000, () => {console.log('Server running on http://localhost:3000');
});
写完代码后,在terminal运行:node 【js文件路径】
node C:\Users\Administrator\Desktop\learning\http.js
然后在浏览器打开http://localhost:3000,如图:

2. 处理请求和响应
- 请求对象 req(request 的缩写):表示客户端的请求对象,包含了关于请求的信息,如请求方法(GET、POST 等)、请求头、请求 URL 等。
req.url: 获取请求路径(如 /api/data)。
req.method: 请求方法(GET、POST 等)。
req.headers: 请求头信息。
req.on(‘data’, callback): 监听请求数据。
req.on(‘end’, callback): 监听请求结束。
- 响应对象 res(response 的缩写):表示服务器的响应对象,用于设置响应头和发送响应数据。
res.writeHead(statusCode, headers): 设置响应头。
res.write(data): 发送响应数据。
res.end(): 结束响应。
res.statusCode: 响应状态码。
res.statusMessage: 响应状态消息。
二、进阶用法
1. 路由管理
语法格式:
// 1.导入http模块
const http = require('http');
// 2.创建http服务
const server = http.createServer((req, res) => {// 3.获取请求路径和请求方法// 这里运用了解构赋值的语法,从 req 对象中提取出 url(请求的路径)和 method(请求的方法)这两个属性。借助这两个属性,服务器就能够依据不同的请求路径和方法来提供不同的响应。const { url, method } = req;// 4.根据请求路径和请求方法返回不同的响应// 若请求的路径是根路径 / 且请求方法为 GET,服务器会通过 res.end() 方法返回字符串 'Home Page' 作为响应。res.end() 方法的作用是结束响应并把数据发送给客户端if (url === '/' && method === 'GET') {// 返回首页res.end('Home Page');// 若请求的路径是 /api 且请求方法为 GET,服务器会创建一个包含 data 属性的对象,再使用 JSON.stringify() 方法将其转换为 JSON 字符串,最后通过 res.end() 方法返回该 JSON 字符串作为响应。} else if (url === '/api' && method === 'GET') {// 返回API数据res.end(JSON.stringify({ data: 'API Response' }));} else {// 若请求的路径和方法不匹配上述任何一种情况,服务器会把响应状态码设置为 404(Not Found),并通过 res.end() 方法返回字符串 'Not Found' 作为响应。res.writeHead(404);res.end('Not Found');}
});
2. 处理 POST 请求
通过这种方式,服务器就能够接收并处理客户端发送过来的数据。
// 这里定义了一个名为 body 的变量,并初始化为一个空数组。这个数组将用于存储从客户端发送过来的数据块(chunk)。
// 在 HTTP 请求中,数据可能会分多个部分(数据块)传输,因此需要一个数组来暂存这些数据块,后续再将它们合并成完整的数据。
let body = [];
// req 是 Node.js 中 HTTP 请求对象,代表客户端发送的请求。
// data 事件会在接收到请求数据时触发,每次触发时会传入一个数据块(chunk)。
// 这里通过监听 data 事件,将每个数据块存入 body 数组中。
req.on('data', (chunk) => {body.push(chunk);
}).on('end', () => {// 'end' 是另一个事件名,表示请求数据已经全部传输完成。此时 body 数组中已经包含了完整的请求数据// 最后,通过 Buffer.concat() 方法将 body 数组中的数据块合并成一个完整的 Buffer 对象,再通过 toString() 方法将其转换为字符串。body = Buffer.concat(body).toString();// 最后,通过 JSON.parse() 方法将字符串转换为对象,再通过 res.end() 方法返回一个包含接收到的数据的字符串。const data = JSON.parse(body);res.end(`Received: ${data}`);
});
3. 中间件模式
通过 use 函数注册中间件,在处理 HTTP 请求时依次执行这些中间件,直到响应结束或所有中间件执行完毕。
语法格式:
// 1. 定义中间件数组:创建了一个空数组 middlewares,用于存储所有注册的中间件函数。中间件是在请求处理过程中可以执行特定任务的函数,例如日志记录、身份验证等。
const middlewares = [];
// 2. 定义 use 函数:use 函数用于向 middlewares 数组中添加中间件函数。当调用 use 函数并传入一个中间件函数时,该函数会被添加到 middlewares 数组的末尾。
function use(middleware) {middlewares.push(middleware);
}
// 3. 创建 HTTP 服务器
const server = http.createServer((req, res) => {let idx = 0;function next() {if (idx < middlewares.length) {middlewares[idx++](req, res, next);} else {// 默认响应res.statusCode = 404;res.end('Not Found');}}next();
});// 使用中间件
// 第一个中间件函数 (req, res, next) => { console.log('Middleware 1'); next(); }:当执行到这个中间件时,会在控制台输出 'Middleware 1',然后调用 next 函数,将控制权传递给下一个中间件。
use((req, res, next) => {console.log('Middleware 1');next();
});
// 第二个中间件函数 (req, res) => { res.end('Hello from Middleware'); }:当执行到这个中间件时,会结束响应并返回 'Hello from Middleware' 给客户端,此时不会再调用 next 函数,因为响应已经结束。
use((req, res) => {res.end('Hello from Middleware');
});
三、常见场景
- 静态文件服务器:
创建了一个简单的静态文件服务器,它会根据客户端请求的 URL 尝试从 public 目录下读取对应的文件,并将文件内容返回给客户端。若文件不存在,则返回 404 错误信息。
// 引入 Node.js 的文件系统模块,用于处理文件和目录操作
const fs = require('fs');
// 引入 Node.js 的路径模块,用于处理和转换文件路径
const path = require('path');// 创建一个 HTTP 服务器实例
const server = http.createServer((req, res) => {// 构建要读取的文件的完整路径// __dirname 是当前执行脚本所在的目录的绝对路径// 'public' 是存储静态文件的目录名// req.url 是客户端请求的 URLconst filePath = path.join(__dirname, 'public', req.url);// 异步读取指定路径的文件内容fs.readFile(filePath, (err, data) => {// 检查读取文件过程中是否出现错误if (err) {// 如果出现错误,将响应的状态码设置为 404,表示未找到资源res.writeHead(404);// 向客户端发送错误信息res.end('File not found');} else {// 如果读取成功,将响应的状态码设置为 200,表示请求成功res.writeHead(200);// 将读取到的文件内容发送给客户端res.end(data);}});
});
- 代理服务器:
接收客户端的请求,然后将请求转发到指定的目标服务器(target-server.com),并将目标服务器的响应返回给客户端。这种代理服务器可以用于多种场景,如负载均衡、缓存、访问控制等。
// 创建一个 HTTP 代理服务器实例
// 当有客户端请求到达时,会触发传入的回调函数进行处理
const httpProxy = http.createServer((req, res) => {// 创建一个对目标服务器的 HTTP 请求// 第一个参数是一个配置对象,用于指定目标服务器的相关信息// host 指定目标服务器的主机名,即要将请求转发到的服务器地址// path 直接使用客户端请求的 URL 路径,将其原样转发给目标服务器const proxyReq = http.request({ host: 'target-server.com', path: req.url },// 当从目标服务器接收到响应时,会触发此回调函数(proxyRes) => {// 将目标服务器的响应流通过管道传输到客户端的响应流// 也就是把目标服务器返回的响应内容直接发送给客户端proxyRes.pipe(res);});// 将客户端的请求流通过管道传输到对目标服务器的请求流// 这样就把客户端的请求内容(如请求体)转发给目标服务器req.pipe(proxyReq);
});
- RESTful API:
在服务器接收到客户端请求时,根据请求的 URL 和请求方法进行不同的处理。如果请求的是 /api/users 且为 GET 请求,服务器会返回所有用户信息;如果请求的是 /api/users/某个用户 ID 且为 GET 请求,服务器会返回该指定用户的信息。
// 定义一个数组 users,用于存储用户信息
// 初始时数组中有一个用户对象,包含用户的 id 和 name
const users = [{ id: 1, name: 'Alice' }];// 为服务器实例添加 request 事件监听器
// 当服务器接收到客户端的请求时,会触发该监听器中的回调函数
server.on('request', (req, res) => {// 检查请求的 URL 是否为 /api/users 且请求方法为 GETif (req.url === '/api/users' && req.method === 'GET') {// 如果满足条件,将 users 数组转换为 JSON 字符串// 并将其作为响应内容返回给客户端res.end(JSON.stringify(users));} // 检查请求的 URL 是否以 /api/users/ 开头且请求方法为 GETelse if (req.url.startsWith('/api/users/') && req.method === 'GET') {// 从请求的 URL 中提取用户 ID// 先使用 split 方法按 / 分割 URL 字符串,然后取索引为 3 的元素// 再将其转换为整数类型const userId = parseInt(req.url.split('/')[3]);// 在 users 数组中查找 id 等于提取的 userId 的用户对象const user = users.find(u => u.id === userId);// 将找到的用户对象转换为 JSON 字符串并作为响应内容返回给客户端res.end(JSON.stringify(user));}
});
四、错误处理与安全
- 错误处理:
这部分代码为 HTTP 服务器实例 server 添加了一个 error 事件监听器。当服务器在运行过程中遇到错误(例如端口被占用、网络连接问题等)时,会触发这个监听器,并将错误对象 err 作为参数传递给回调函数。在回调函数中,使用 console.error 将错误信息输出到控制台,以便开发者能够及时发现和排查问题。
server.on('error', (err) => {console.error('Server error:', err);
});
- 超时设置:
server.timeout 属性用于设置服务器的超时时间,单位为毫秒。这里将超时时间设置为 5000 毫秒(即 5 秒)。当一个请求在 5 秒内没有完成处理时,服务器会自动终止该请求,并触发 timeout 事件(如果有相应的事件监听器)。这有助于防止服务器因为处理长时间运行的请求而被阻塞,从而影响其他请求的处理。
server.timeout = 5000; // 5秒
- 使用 helmet 库设置安全头:helmet 是一个 Node.js 库,它可以帮助开发者设置一系列 HTTP 响应头,以提高应用程序的安全性。例如,设置 Content-Security-Policy 头可以防止跨站脚本攻击(XSS),设置 X-Frame-Options 头可以防止点击劫持攻击等。通过使用 helmet,可以简化安全头的设置过程,并确保遵循最佳安全实践。
学习方向:安装和使用 helmet 库,了解它提供的各种安全头选项及其作用。深入学习每个安全头的具体含义和配置方法,例如 Content-Security-Policy 的指令语法和 X-Content-Type-Options 的用途。学习如何根据应用程序的具体需求和安全策略来定制 helmet 的配置。
- 验证输入数据,防止 SQL 注入或 XSS 攻击:在处理用户输入时,必须对输入数据进行验证和过滤,以防止恶意用户通过输入恶意代码来执行 SQL 注入或 XSS 攻击。例如,在处理数据库查询时,使用参数化查询可以防止 SQL 注入;在输出用户输入到 HTML 页面时,对特殊字符进行转义可以防止 XSS 攻击。
学习方向:学习 SQL 注入的原理和常见的攻击方式,以及如何使用参数化查询、预处理语句等技术来防止 SQL 注入。了解 XSS 攻击的类型(反射型、存储型、DOM 型)及其原理,学习如何对用户输入进行过滤和转义,以及使用内容安全策略来防止 XSS 攻击。探索使用验证库(如 validator.js)来简化输入数据的验证过程。
- 限制请求体大小,防止 DDoS 攻击:限制请求体的大小可以防止攻击者通过发送大量数据来耗尽服务器的资源,从而导致拒绝服务(DDoS)攻击。通过设置一个合理的请求体大小限制,服务器可以拒绝过大的请求,保护自身的稳定性和可用性。
学习方向:了解不同的 HTTP 服务器框架(如 Express.js、Koa.js 等)中如何设置请求体大小限制。
研究 DDoS 攻击的类型和原理,以及其他防止 DDoS 攻击的方法,如使用防火墙、负载均衡器等。
学习如何根据服务器的性能和应用程序的需求来确定合适的请求体大小限制。
五、对比 http 与 Express
http 模块是 Node.js 的内置模块,用于创建 HTTP 服务器。
Express 是一个更高级的 HTTP 框架,基于 http 模块封装,提供了更多的特性,使得开发更加便捷。

六、工具库推荐:
express: 更高级的 HTTP 框架。
axios: 用于发送 HTTP 请求。
nodemon: 开发时自动重启服务器。
相关文章:
【Node.js入门笔记10---http 模块】
Node.js入门笔记10 Node.js---http 模块一、核心功能0.学习http的前提1. 创建 HTTP 服务器2. 处理请求和响应 二、进阶用法1. 路由管理2. 处理 POST 请求3. 中间件模式 三、常见场景四、错误处理与安全五、对比 http 与 Express六、工具库推荐: Node.js—http 模块 …...
深拷贝在 JavaScript 中的几种实现方式对比
深拷贝在 JavaScript 中的几种实现方式对比 1. JSON 序列化法2. 结构化克隆(structuredClone)原理与使用 3. 自定义深拷贝函数原理与使用 性能对比与选择建议性能比较 综合建议:示例代码整合总结 在开发过程中,我们经常需要对对象…...
实验11 机器学习-贝叶斯分类器
实验11 机器学习-贝叶斯分类器 一、实验目的 (1)理解并熟悉贝叶斯分类器的思想和原理; (2)熟悉贝叶斯分类器的数学推导过程; (3)能运用贝叶斯分类器解决实际问题并体会算法的效果&a…...
Delta Lake 解析:架构、数据处理流程与最佳实践
Delta Lake 是一个基于 Apache Spark 的开源存储层,主要解决传统数据湖(Data Lake)缺乏 ACID 事务、数据一致性和性能优化的问题,使大数据处理更加可靠、高效。从本质上讲,它让数据湖具备了数据仓库的结构化管理能力&a…...
OpenHarmony子系统开发 - 电池管理(二)
OpenHarmony子系统开发 - 电池管理(二) 五、充电限流限压定制开发指导 概述 简介 OpenHarmony默认提供了充电限流限压的特性。在对终端设备进行充电时,由于环境影响,可能会导致电池温度过高,因此需要对充电电流或电…...
hive 数据简介
Hive介绍 1)Hive简介 Hive是基于Hadoop的一个数据仓库工具,用于结构化数据的查询、分析和汇总。Hive提供类SQL查询功能,它将SQL转换为MapReduce程序。 Hive不支持OLTP,Hive无法提供实时查询。 2)Hive在大数据生态环境…...
Win32桌面编程:ACLUI.DLL,EditSecurity(IntPtr hwndOwner, ISecurityInformation psi)
在Windows编程中,我们通常需要借助通用对话框的力量,今天我们就聊一下“安全属性表”通用对话框的使用心得。 当我们调用EditSecurity函数时: 1.EditSecurity将调用ISecurityInformation中的GetObjectInformation函数 在编写 ISecurityInf…...
数据分析异步进阶:aiohttp与Asyncio性能提升
一、时间轴呈现方案进程 2023-04-01:需求确认 确定目标:使用aiohttp与Asyncio提升采集性能,目标采集今日头条网站的新闻数据(标题、内容、时间等)。同时要求在程序中加入代理IP、Cookie和UserAgent的设置,…...
《AI大模型趣味实战 》第8集:多端适配 个人新闻头条 基于大模型和RSS聚合打造个人新闻电台(Flask WEB版) 2
《AI大模型趣味实战 》第8集:多端适配 个人新闻头条 基于大模型和RSS聚合打造个人新闻电台(Flask WEB版) 2 摘要 本文末尾介绍了如何实现新闻智能体的方法。在信息爆炸的时代,如何高效获取和筛选感兴趣的新闻内容成为一个现实问题。本文将带领读者通过P…...
低配电脑畅玩《怪物猎人:荒野》,ToDesk云电脑优化从30帧到144帧?
《怪物猎人:荒野(Monster Hunter Wilds)》自2025年正式发售以来已取得相当亮眼的成绩,仅用三天时间便轻松突破800万销量,目前顺利蝉联周榜冠军;凭借着开放世界的宏大场景和丰富的狩猎玩法,该游戏…...
Leetcode刷题笔记1 图论part03
卡码网 101 孤岛总面积 from collections import deque directions [[0, 1], [1, 0], [0, -1], [-1, 0]] count 0def main():global countn, m map(int, input().split())grid []for _ in range(n):grid.append(list(map(int, input().split())))for i in range(n):if gri…...
【模拟面试】计算机考研复试集训(第十一天)
文章目录 前言一、专业面试1、什么是面向对象编程?2、软件工程的主要模型有哪些?3、Cache和寄存器的区别4、卷积层有哪些参数,它们代表什么?5、你有读博的打算吗?6、你的师兄/姐临近毕业,仍做不出成果&…...
查看自己的公有ip
IP 地址 112.3.88.1** 是一个 公有 IP 地址,而不是私有 IP 地址。 公有 IP 地址 vs 私有 IP 地址 公有 IP 地址: 用于在互联网上唯一标识设备。由互联网服务提供商(ISP)分配。可以在全球范围内路由和访问。例如:112.3.88.156、8.8…...
【js逆向入门】图灵爬虫练习平台 第九题
地址:aHR0cHM6Ly9zdHUudHVsaW5ncHl0b24uY24vcHJvYmxlbS1kZXRhaWwvOS8 f12进入了debugger,右击选择一律不在此处暂停, 点击继续执行 查看请求信息 查看载荷,2个加密参数,m和tt 查看启动器,打上断点 进来 往…...
NET6 WebApi第5讲:中间件(源码理解,俄罗斯套娃怎么来的?);Web 服务器 (Nginx / IIS / Kestrel)、WSL、SSL/TSL
一、NET6的启动流程 区别: .NET6 WebApi第1讲:VSCode开发.NET项目、区别.NET5框架【两个框架启动流程详解】_vscode webapi-CSDN博客 2、WebApplicationBuilder:是NET6引入的一个类,是建造者模式的典型应用 1>建造者模式的…...
Nginx及前端部署全流程:初始化配置到生产环境部署(附Nginx常用命令)
nginx&前端从初始化配置到部署(xshell) 前言下载nginx前端打包与创建具体文件夹路径配置nginx.nginx.conf文件配置项内容 配置nginx.service文件配置项内容 启动nginx常用nginx命令 前言 目标:在xshell中部署前端包。 第一步:…...
python 实现一个简单的window 任务管理器
import tkinter as tk from tkinter import ttk import psutil# 运行此代码前,请确保已经安装了 psutil 库,可以使用 pip install psutil 进行安装。 # 由于获取进程信息可能会受到权限限制,某些进程的信息可能无法获取,代码中已经…...
【AI模型】深度解析:DeepSeek的联网搜索的实现原理与认知误区
一、大模型的“联网魔法”:原来你是这样上网的! 在人工智能这个舞台上,大模型们可是妥妥的明星。像DeepSeek、QWen这些大模型,个个都是知识渊博的“学霸”,推理、生成文本那叫一个厉害。不过,要是论起上网…...
【xiaozhi赎回之路-2:语音可以自己配置就是用GPT本地API】
固件作用 打通了网络和硬件的沟通 修改固件实现【改变连接到小智服务器的】 回答逻辑LLM自定义 自定义了Coze(比较高级,自定义程度比较高,包括知识库,虚拟脚色-恋人-雅思老师-娃娃玩具{可能需要使用显卡对开源模型进行微调-产…...
WX小程序
下载 package com.sky.utils;import com.alibaba.fastjson.JSONObject; import org.apache.http.NameValuePair; import org.apache.http.client.config.RequestConfig; import org.apache.http.client.entity.UrlEncodedFormEntity; import org.apache.http.client.methods.Cl…...
JavaScript案例0322
以下是一些涵盖不同高级JavaScript概念和应用的案例,每个案例都有详细解释: 案例1:实现 Promise/A 规范的手写 Promise class MyPromise {constructor(executor) {this.state pending;this.value undefined;this.reason undefined;this.o…...
Spring boot 3.4 后 SDK 升级,暨 UI API/MCP 计划
PS 写这篇文章后看到 A Deep Dive Into MCP and the Future of AI Tooling | Andreessen HorowitzWe explore what MCP is, how it changes the way AI interacts with tools, what developers are already building, and the challenges that still need solving. https://a1…...
大数据学习(78)-spark streaming与flink
🍋🍋大数据学习🍋🍋 🔥系列专栏: 👑哲学语录: 用力所能及,改变世界。 💖如果觉得博主的文章还不错的话,请点赞👍收藏⭐️留言📝支持一…...
2.企业级AD活动目录架构与设计原则实战指南
一、企业级AD架构核心组件解析 1.1 多域森林架构设计 核心概念: 单域模型:适用于中小型企业(<5万用户) 多域模型:满足跨国/多部门隔离需求 森林(Forest):安全信任边界&#x…...
Linux下JDK1.8安装配置
目录 1.下载完上传到Linux系统中 2.解压JDK压缩包 3.配置JDK环境变量 4.设置环境变量生效 5.查看环境变量是否配置成功 官网下载地址:Java Downloads | Oracle 1.下载完上传到Linux系统中 2.解压JDK压缩包 tar -zxvf jdk-8u151-linux-x64.tar.gz -C /usr/local (解压…...
Python OCR文本识别详细步骤及代码示例
光学字符识别(OCR)是将图像中的文字转换为可编辑文本的技术。在Python中,我们可以利用多种库实现OCR功能。本文将详细介绍使用Tesseract和EasyOCR进行文本识别的步骤,并提供完整的代码示例。 一、OCR简介 OCR(Optical…...
OpenCV 基础模块 Python 版
OpenCV 基础模块权威指南(Python 版) 一、模块全景图 plaintext OpenCV 架构 (v4.x) ├─ 核心层 │ ├─ core:基础数据结构与操作(Mat/Scalar/Point) │ └─ imgproc:图像处理流水线(滤…...
华为HCIE网络工程师培训选机构攻略
从 官方授权机构 到 性价比黑马,结合价格、师资、通过率等维度,为你筛选出最适合的培训方案。 一、华为官方授权机构(优先推荐) 华为官方授权机构拥有 真机实验环境考官级讲师,适合预算充足、追求高通过率的学员。 机…...
Linux固定IP方法(RedHat+Net模式)
1、查看当前网关 ip route | grep default 2、配置静态IP 双击重启 3、验证...
210、【图论】课程表(Python)
题目 思路 这道题本质上是一个拓扑排序。每次先统计每个点的入度个数、然后再统计点与点之间的邻接关系,找到入度为0的点作为起始遍历点。之后每遍历到这个点之后,就把这个点后续的邻接关系边的点入度减去一。当某个点入度为0时,继续被加入其…...
