当前位置: 首页 > news >正文

Go实现http同步文件操作 - 增删改查

http同步文件操作 - 增删改查

  • http同步文件操作 - 增删改查
  • 1. 前置要求
    • 1.1. 构建结构体 文件名 + 文件内容
      • 1.1.1. 页面结构体
      • 1.1.2. 为`Page`结构体绑定方法:`Save`
      • 1.1.3. 对`Page`结构体支持页面内容查看方法,同时提供页面文件是否存在的方法
    • 1.2. 简单验证上面的结构体是否可以直接改变值
  • 使用HTTP来完成对页面的增删改查
    • 1. 增加对页面文件保存的操作
      • 增加mian方法,进行测试
    • 2. 增加对页面文件进行查看内容的操作
      • 增加mian方法,进行测试
    • 3. 增加对页面文件删除操作
      • 增加mian方法,进行测试
    • 4. 增加对页面文件内容更新的操作
      • 增加mian方法,进行测试
      • 增删改查的操作保存在一个文件里,内容如下
  • other

http同步文件操作 - 增删改查

1. 前置要求

1.1. 构建结构体 文件名 + 文件内容

1.1.1. 页面结构体

type Page struct {Title string `json:"title"`Body  string `json:"body"`
}
// ``符号为结构体的标准,可忽略

1.1.2. 为Page结构体绑定方法:Save

// SavePage 页面文件保存方法,保存到数据库,这里保存到页面文件中
// 使用bufio操作文件
// notice: 延时关闭 flush
// 绑定Page指针变量
func (page *Page) SavePage(title string, body string) (err error) {title += ".txt"// todo 1. 拿到页面文件句柄file, err := os.OpenFile(title, os.O_CREATE|os.O_RDWR, fs.ModePerm)// todo final stepdefer func() { _ = file.Close() }()if err != nil {fmt.Println("无法获取到页面文件,error:", err)return err}// todo 2. 打开页面文件writer := bufio.NewWriter(file)// todo 3. 往页面文件写入内容nByteNum, err := writer.Write([]byte(body))if err != nil {fmt.Println("页面文件保存失败,error:", err)return err}// todo 4. 刷写数据出去_ = writer.Flush()fmt.Println("写入的内容大小为:", nByteNum, "字节")return nil
}
  1. 内容添加文件后缀,固定为.txt

  2. 使用bufio操作文件,可以更换其它方式

  3. *指针变量

  4. 注意事项:

    1. 延时关闭

      defer func() { _ = file.Close() }()

    2. 数据刷写

      _ = writer.Flush()

1.1.3. 对Page结构体支持页面内容查看方法,同时提供页面文件是否存在的方法


// 判断是否存在该页面文件名,不需要加后缀!已经手动添加;也可以优化,多加入参数表示后缀即可
func ExistFile(fileName string) bool {if _, err := os.Stat(fileName + ".txt"); err != nil {if os.IsNotExist(err) {return false}}return true
}// 查看指定的页面文件内容
// 使用os操作文件
func ViewPage(title string) (page *Page) {page = &Page{}page.Title = titleif ExistFile(title) {fileContent, err := os.ReadFile(title + ".txt")if err != nil {fmt.Println("读取页面文件出错, error is :", err)} else {page.Body = string(fileContent)}}return page
}
  • 上面内容为一个文件,该entity/entity.go文件的全部代码为:
package entityimport ("bufio""fmt""io/fs""os"
)type Page struct {Title string `json:"title"`Body  string `json:"body"`
}// SavePage 页面文件保存方法,保存到数据库,这里保存到页面文件中
// 使用bufio操作文件
// notice: 延时关闭 flush
func (page *Page) SavePage(title string, body string) (err error) {title += ".txt"// todo 1. 拿到页面文件句柄file, err := os.OpenFile(title, os.O_CREATE|os.O_RDWR, fs.ModePerm)// todo final stepdefer func() { _ = file.Close() }()if err != nil {fmt.Println("无法获取到页面文件,error:", err)return err}// todo 2. 打开页面文件writer := bufio.NewWriter(file)// todo 3. 往页面文件写入内容nByteNum, err := writer.Write([]byte(body))if err != nil {fmt.Println("页面文件保存失败,error:", err)return err}// todo 4. 刷写数据出去_ = writer.Flush()fmt.Println("写入的内容大小为:", nByteNum, "字节")return nil
}// 判断是否存在该页面文件名,不需要加后缀!
func ExistFile(fileName string) bool {if _, err := os.Stat(fileName + ".txt"); err != nil {if os.IsNotExist(err) {return false}}return true
}// 查看指定的页面文件内容
// 使用os操作文件
func ViewPage(title string) (page *Page) {page = &Page{}page.Title = titleif ExistFile(title) {fileContent, err := os.ReadFile(title + ".txt")if err != nil {fmt.Println("读取页面文件出错, error is :", err)} else {page.Body = string(fileContent)}}return page
}

1.2. 简单验证上面的结构体是否可以直接改变值

func main() {// 验证你的结构体是否发生改变 - 指针变量page := entity.ViewPage("TestPage")fmt.Println(page)page.Body = "change"fmt.Println(page)
}

使用HTTP来完成对页面的增删改查

1. 增加对页面文件保存的操作

// http方式保存page
// 默认从请求体中获取内容作为body传入文件
// 直接调用/savePage的body默认值为:this is a default value
// 更新操作也会调用该方法,body值为 上传的请求体内容
func saveHandler(responseWriter http.ResponseWriter, request *http.Request) {// todo 1. 在url中获取 page的title值title := request.URL.Path[len("/savePage/"):]// todo 2. 填充 body内容page := &entity.Page{}// important 本人在后面update会遇到坑,默认从请求体中获取body// todo 2.1. 优先考虑从请求体获取bodybody := request.FormValue("body")// todo 2.2. 请求体为空串,则赋值默认值if body == "" {body = "this is a default value"}// todo 3. 将body值写入到页面文件err := page.SavePage(title, body)// todo 3.1. 展示写入结果if err != nil {_, _ = responseWriter.Write([]byte("页面文件保存不成功"))fmt.Println("页面文件保存不成功,error is :", err)return} else {message := "页面文件保存成功"_, _ = responseWriter.Write([]byte(message))fmt.Println(message)}
}

增加mian方法,进行测试

func main() {// url路径要对应,当然你也可以更改;// 若修改viewPage,上面的viewHandler方法也要对应改变http.HandleFunc("/savePage/", saveHandler)err := http.ListenAndServe(":8989", nil)if err != nil {fmt.Println("端口异常")}
}
  • 运行程序,然后到浏览器访问:localhost:8989/viewPage/myFirst2

    • 结果会展示

      • 在这里插入图片描述

      • 页面也会展示成功的提示

    • 项目目录下会生成myFirst2.txt文件,内容为:

      this is a default value
      

2. 增加对页面文件进行查看内容的操作

// http 方式查看特定的page内容
// 使用硬编码页面
func viewHandler(responseWriter http.ResponseWriter, request *http.Request) {// todo 1. 在url中获取 page的title值title := request.URL.Path[len("/viewPage/"):]// todo 2. 判断是否已经存在该页面文件if !entity.ExistFile(title) {// todo 2.1. 不存在该页面文件就结束fmt.Printf("不存在%v页面文件", title)_, _ = responseWriter.Write([]byte("不存在该页面文件"))return}// todo 2.2. 获取该页面的内容page := entity.ViewPage(title)body := []byte(page.Body)// todo 3. 页面展示内容_, _ = responseWriter.Write(body)
}

增加mian方法,进行测试

func main() {// url路径要对应,当然你也可以更改;// 若修改viewPage,上面的viewHandler方法也要对应改变http.HandleFunc("/savePage/", saveHandler)http.HandleFunc("/viewPage/", viewHandler)err := http.ListenAndServe(":8989", nil)if err != nil {fmt.Println("端口异常")}
}
  • 运行程序,到浏览器输入 localhost:8989/viewPage/myFirst2

    • 会查看当前项目下是否存在myFirst2.txt文件,如果存在,则会返回页面文件内容。反之会展示不存在该页面文件内容

      • 我们前面生成了myFirst2.txt文件,效果为:

        • 在这里插入图片描述

        • 页面展示的内容为文件的内容

      • 我们访问没有对应的文件url:localhost:8989/viewPage/myFirst3

        • 效果为:

          在这里插入图片描述

        • 即页面展示不存在该文件。你也可以再利用savePage来生成一个myFirst3.txt文件

3. 增加对页面文件删除操作

// http方式删除页面文件
func deleteHandler(responseWriter http.ResponseWriter, request *http.Request) {// todo 1. 在url中获取 page的title值title := request.URL.Path[len("/deletePage/"):]// todo 2. 判断是否存在该页面文件if !entity.ExistFile(title) {_, _ = responseWriter.Write([]byte("页面文件不存在,无法删除"))return} else {// todo 3. 移除页面文件err := os.Remove(title + ".txt")if err != nil {_, _ = responseWriter.Write([]byte("页面文件删除异常,请检查你的权限,或者联系管理员"))return}_, _ = responseWriter.Write([]byte("页面文件删除成功"))}
}

增加mian方法,进行测试

func main() {// url路径要对应,当然你也可以更改;// 若修改viewPage,上面的viewHandler方法也要对应改变http.HandleFunc("/savePage/", saveHandler)http.HandleFunc("/viewPage/", viewHandler)http.HandleFunc("/deletePage/", deleteHandler)err := http.ListenAndServe(":8989", nil)if err != nil {fmt.Println("端口异常")}
}
  • 运行程序,到浏览器输入 localhost:8989/deletePage/myFirst2

    • 程序会删除myFirst2文件,效果为:

      在这里插入图片描述

      • 项目下的文件已经被删除,若此时再次执行则会提示无法删除

        在这里插入图片描述

4. 增加对页面文件内容更新的操作

// http方式更新页面文件
func updateHandler(responseWriter http.ResponseWriter, request *http.Request) {// todo 1. 在url中获取 page的title值title := request.URL.Path[len("/updatePage/"):]// todo 2. 查看该页面文件page := entity.ViewPage(title)// todo 3. 填充html页面,硬编码fmt.Fprintf(responseWriter, "<h1>Editing %s</h1>"+// 直接调用了 saveHandler// todo 4. 再次保存该页面文件"<form action=\"/savePage/%s\" method=\"POST\">"+"<textarea name=\"body\">%s</textarea><br>"+"<input type=\"submit\" value=\"Save\">"+"</form>",page.Title, page.Title, page.Body)
}
  • notice :todo的第四步,保存后会出发/savePage的访问动作

增加mian方法,进行测试

func main() {// url路径要对应,当然你也可以更改;// 若修改viewPage,上面的viewHandler方法也要对应改变http.HandleFunc("/savePage/", saveHandler)http.HandleFunc("/viewPage/", viewHandler)http.HandleFunc("/deletePage/", deleteHandler)http.HandleFunc("/updatePage/", updateHandler)err := http.ListenAndServe(":8989", nil)if err != nil {fmt.Println("端口异常")}
}
  • 运行程序,到浏览器输入 localhost:8989/updatePage/myFirst2

    • 页面会返回一个html页面,效果为:

      在这里插入图片描述

      • 尝试在文本框输入内容,这里输入hello,java页 可乐 唱跳rap,然后点击Save进行保存。

        • 然后页面会进行跳转到保存页面,效果图为:

          在这里插入图片描述

增删改查的操作保存在一个文件里,内容如下

package mainimport ("fmt""goland-setting/test/webapp/entity""net/http""os"
)// http 方式查看特定的page
// 使用硬编码页面
func viewHandler(responseWriter http.ResponseWriter, request *http.Request) {// todo 1. 在url中获取 page的title值title := request.URL.Path[len("/viewPage/"):]// todo 2. 判断是否已经存在该页面文件if !entity.ExistFile(title) {// todo 2.1. 不存在该页面文件就结束fmt.Printf("不存在%v页面文件", title)_, _ = responseWriter.Write([]byte("不存在该页面文件"))return}// todo 2.2. 获取该页面的内容page := entity.ViewPage(title)body := []byte(page.Body)// todo 3. 页面展示内容_, _ = responseWriter.Write(body)
}// http方式保存page
// 默认从请求体中获取body
// 直接调用/savePage的body默认值为:this is a default value
// 更新操作也会调用该方法,body值为 上传的请求体内容
func saveHandler(responseWriter http.ResponseWriter, request *http.Request) {// todo 1. 在url中获取 page的title值title := request.URL.Path[len("/savePage/"):]// todo 2. 填充 body内容page := &entity.Page{}// important 本人在后面update会遇到坑,默认从请求体中获取body// todo 2.1. 优先考虑从请求体获取bodybody := request.FormValue("body")// todo 2.2. 请求体为空串,则赋值默认值if body == "" {body = "this is a default value"}// todo 3. 将body值写入到页面文件err := page.SavePage(title, body)// todo 3.1. 展示写入结果if err != nil {_, _ = responseWriter.Write([]byte("页面文件保存不成功"))fmt.Println("页面文件保存不成功,error is :", err)return} else {message := "页面文件保存成功"_, _ = responseWriter.Write([]byte(message))fmt.Println(message)}
}// http方式删除页面文件
func deleteHandler(responseWriter http.ResponseWriter, request *http.Request) {// todo 1. 在url中获取 page的title值title := request.URL.Path[len("/deletePage/"):]// todo 2. 判断是否存在该页面文件if !entity.ExistFile(title) {_, _ = responseWriter.Write([]byte("页面文件不存在,无法删除"))return} else {// todo 3. 移除页面文件err := os.Remove(title + ".txt")if err != nil {_, _ = responseWriter.Write([]byte("页面文件删除异常,请检查你的权限,或者联系管理员"))return}_, _ = responseWriter.Write([]byte("页面文件删除成功"))}
}// http方式更新页面文件
func updateHandler(responseWriter http.ResponseWriter, request *http.Request) {// todo 1. 在url中获取 page的title值title := request.URL.Path[len("/updatePage/"):]// todo 2. 查看该页面文件page := entity.ViewPage(title)// todo 3. 填充html页面fmt.Fprintf(responseWriter, "<h1>Editing %s</h1>"+// 直接调用了 saveHandler// todo 4. 再次保存该页面文件"<form action=\"/savePage/%s\" method=\"POST\">"+"<textarea name=\"body\">%s</textarea><br>"+"<input type=\"submit\" value=\"Save\">"+"</form>",page.Title, page.Title, page.Body)
}func main() {http.HandleFunc("/savePage/", saveHandler)http.HandleFunc("/deletePage/", deleteHandler)http.HandleFunc("/updatePage/", updateHandler)http.HandleFunc("/viewPage/", viewHandler)err := http.ListenAndServe(":8989", nil)if err != nil {fmt.Println("端口异常")}
}

一个简单的webApp就完成了。

other

  • 对于更新操作,服务器硬编码html太难了,可以使用html/template来渲染,这样会好很多。

相关文章:

Go实现http同步文件操作 - 增删改查

http同步文件操作 - 增删改查 http同步文件操作 - 增删改查1. 前置要求1.1. 构建结构体 文件名 文件内容1.1.1. 页面结构体1.1.2. 为Page结构体绑定方法&#xff1a;Save1.1.3. 对Page结构体支持页面内容查看方法&#xff0c;同时提供页面文件是否存在的方法 1.2. 简单验证上面…...

Spring Boot整合 Spring Security

Spring Boot整合 1、RBAC 权限模型 RBAC模型&#xff08;Role-Based Access Control&#xff1a;基于角色的访问控制&#xff09; 在RBAC模型里面&#xff0c;有3个基础组成部分&#xff0c;分别是&#xff1a;用户、角色和权限&#xff0c;它们之间的关系如下图所示 SELECT…...

浅谈低代码

低代码开发是近年来迅速崛起的软件开发方法&#xff0c;让编写应用程序变得更快、更简单。有人说它是美味的膳食&#xff0c;让开发过程高效而满足&#xff0c;但也有人质疑它是垃圾食品&#xff0c;缺乏定制性与深度。你认为低代码到底是美以下方向仅供参考。味的膳食还是垃圾…...

Innodb-ruby深入探索Innodb存储结构

达在之前已经分享过Innodb数据存储结构知识&#xff0c;但是都是基于理论原理知识理解&#xff0c;今天利用Innodb文件解析工具ruby进行探索Innodb真实的存储结构。 索引原理过程&#xff1a;【Mysql】 InnoDB引擎深入 - 数据页 | 聚集索引_innodb的聚集索引的数据插入_Surviv…...

Echarts的使用 笔记

1.数据可视化前言 1.1.什么是数据可视化 数据可视化&#xff1a; 就是把数据以更加直观的方式进行呈现. 1.2.数据可视化的好处 清晰有效地传达与沟通信息更容易洞察隐藏在数据中的信息 2.ECharts的基本使用 2.1.ECharts官网 ECharts是百度公司开源的一个使用 JavaScript 实…...

信息系统工程的基本概念

系统是由相互作用和相互依赖的若干部分&#xff0c;按一定规律结合成的、具有特定功能的有机整体。系统有下述特性&#xff1a; &#xff08;1&#xff09;集合性。系统是由许多元素有机地组成的整体。每个元素服从整体&#xff0c;追求全局最优。 &#xff08;2&#xff09;相…...

SAP UI5 walkthrough step10 Descriptor for Applications

在这一步&#xff0c;我们将会把所有的应用相关的描述性的文件独立放到manifest.json 新建一个manifest.json文件 webapp/manifest.json (New) {"_version": "1.58.0","sap.app": {"id": "ui5.walkthrough","i18n&q…...

打造专属小程序,乔拓云模板平台助力商家抢占先机

打造专属小程序&#xff0c;乔拓云模板平台助力商家抢占先机&#xff01;该平台涵盖全行业小程序模板&#xff0c;一键复制即可上线。 想要快速创建高效实用的小程序&#xff0c;乔拓云小程序模板开发平台为您提供了解决方案&#xff01;我们为您提供一系列精心设计的小程序模板…...

Vue2学习(组件的使用)

Vue中使用组件的三个步骤&#xff1a; 一、定义组件(或者叫创建组件) 使用Vue.extend(options)创建&#xff0c;其中options和new Vue(options)时传入的那个options几乎一样&#xff0c;但也有点区别&#xff1b; 区别如下&#xff1a; 1.el不要写&#xff0c;为什么&#x…...

基于Spring、SpringMVC、MyBatis开发的游乐场管理系统

文章目录 项目介绍主要功能截图:部分代码展示设计总结项目获取方式🍅 作者主页:超级无敌暴龙战士塔塔开 🍅 简介:Java领域优质创作者🏆、 简历模板、学习资料、面试题库【关注我,都给你】 🍅文末获取源码联系🍅 项目介绍 基于Spring、SpringMVC、MyBatis开发的游…...

数据清洗、特征工程和数据可视化、数据挖掘与建模的应用场景

1.5 数据清洗、特征工程和数据可视化、挖掘建模的应用场景 视频为《Python数据科学应用从入门到精通》张甜 杨维忠 清华大学出版社一书的随书赠送视频讲解1.5节内容。本书已正式出版上市&#xff0c;当当、京东、淘宝等平台热销中&#xff0c;搜索书名即可。内容涵盖数据科学应…...

Qt简介、工程文件分离、创建Qt工程、Qt的帮助文档

QT 简介 core&#xff1a;核心模块&#xff0c;非图形的接口类&#xff0c;为其它模块提供支持 gui&#xff1a;图形用户接口&#xff0c;qt5之前 widgets&#xff1a;图形界面相关的类模块 qt5之后的 database&#xff1a;数据库模块 network&#xff1a;网络模块 QT 特性 开…...

机器学习与低代码开发:创新驱动的双剑合璧

引言 随着科技的日新月异&#xff0c;机器学习和低代码开发已经成为引领技术行业变革的两大重要趋势。机器学习通过模拟人类的学习方式&#xff0c;让计算机具备了自我学习和预测的能力&#xff0c;打破了传统计算机程序的局限性。而低代码开发则以简化软件开发过程为目标&…...

企业博客SEO:优化SOP,助您提升搜索引擎可见性

企业博客是互联网时代企业与用户沟通的重要渠道之一&#xff0c;引流成本也比较低。然而&#xff0c;依然有企业会处在3种状态&#xff1a; 1. 有博客&#xff0c;但内容更新不积极或搁置 2. 有博客&#xff0c;但内容散乱 3. 根本就没有博客 如果是这几种状态&#xff0c;…...

[HITCON 2017]SSRFme perl语言的 GET open file 造成rce

这里记录学习一下 perl的open缺陷 这里首先本地测试一下 发现这里使用open打开 的时候 如果通过管道符 就会实现命令执行 然后这里注意的是 perl 中的get 调用了 open的参数 所以其实我们可以通过管道符实现命令执行 然后这里如果file可控那么就继续可以实现命令执行 这里就…...

华为配置Smart Link主备备份示例

定义 Smart Link&#xff0c;又叫做备份链路。一个Smart Link由两个接口组成&#xff0c;其中一个接口作为另一个的备份。Smart Link常用于双上行组网&#xff0c;提供可靠高效的备份和快速的切换机制。 Monitor Link是一种接口联动方案&#xff0c;它通过监控设备的上行接口…...

harmonyOS开发技巧(一)——封装hilog日志

1. 创建sharedLibrary共享hsp包commonLib&#xff1a;功能工具类。 import hilog from ohos.hilog;class Logger {private DOMAIN: number 0x0000;private APP_NAME: string Myapplication;public info(tag: string, ...args: string[]) {hilog.info(this.DOMAIN, [${this.A…...

npm、yarn常用命令

1、设置npm路径 #全局安装路径 npm config set prefix "D:\Program Files\nodejs\node_global" #缓存路径 npm config set cache "D:\Program Files\nodejs\node_cache"2、设置镜像 #1,淘宝镜像源 npm config set registry https://registry.npmmirror.…...

编译和使用WPS-ghrsst-to-intermediate生成SST

一、下载 V1.0 https://github.com/bbrashers/WPS-ghrsst-to-intermediate/tree/masterV1.5&#xff08;使用过程报错&#xff0c;原因不详&#xff0c;能正常使用的麻烦告知一下方法&#xff09; https://github.com/dmitryale/WPS-ghrsst-to-intermediate二、修改makefile…...

通过静态HTTP实现负载均衡

在当今的互联网环境中&#xff0c;随着用户数量的不断增加和业务需求的不断扩大&#xff0c;单台服务器往往无法承受所有的访问压力。为了确保网站的可用性和性能&#xff0c;负载均衡成为了一种常见的解决方案。本文将探讨如何通过静态HTTP实现负载均衡&#xff0c;以提升网站…...

<6>-MySQL表的增删查改

目录 一&#xff0c;create&#xff08;创建表&#xff09; 二&#xff0c;retrieve&#xff08;查询表&#xff09; 1&#xff0c;select列 2&#xff0c;where条件 三&#xff0c;update&#xff08;更新表&#xff09; 四&#xff0c;delete&#xff08;删除表&#xf…...

Cesium1.95中高性能加载1500个点

一、基本方式&#xff1a; 图标使用.png比.svg性能要好 <template><div id"cesiumContainer"></div><div class"toolbar"><button id"resetButton">重新生成点</button><span id"countDisplay&qu…...

理解 MCP 工作流:使用 Ollama 和 LangChain 构建本地 MCP 客户端

&#x1f31f; 什么是 MCP&#xff1f; 模型控制协议 (MCP) 是一种创新的协议&#xff0c;旨在无缝连接 AI 模型与应用程序。 MCP 是一个开源协议&#xff0c;它标准化了我们的 LLM 应用程序连接所需工具和数据源并与之协作的方式。 可以把它想象成你的 AI 模型 和想要使用它…...

高危文件识别的常用算法:原理、应用与企业场景

高危文件识别的常用算法&#xff1a;原理、应用与企业场景 高危文件识别旨在检测可能导致安全威胁的文件&#xff0c;如包含恶意代码、敏感数据或欺诈内容的文档&#xff0c;在企业协同办公环境中&#xff08;如Teams、Google Workspace&#xff09;尤为重要。结合大模型技术&…...

【HarmonyOS 5 开发速记】如何获取用户信息(头像/昵称/手机号)

1.获取 authorizationCode&#xff1a; 2.利用 authorizationCode 获取 accessToken&#xff1a;文档中心 3.获取手机&#xff1a;文档中心 4.获取昵称头像&#xff1a;文档中心 首先创建 request 若要获取手机号&#xff0c;scope必填 phone&#xff0c;permissions 必填 …...

基于SpringBoot在线拍卖系统的设计和实现

摘 要 随着社会的发展&#xff0c;社会的各行各业都在利用信息化时代的优势。计算机的优势和普及使得各种信息系统的开发成为必需。 在线拍卖系统&#xff0c;主要的模块包括管理员&#xff1b;首页、个人中心、用户管理、商品类型管理、拍卖商品管理、历史竞拍管理、竞拍订单…...

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的“no matching...“系列算法协商失败问题

【SSH疑难排查】轻松解决新版OpenSSH连接旧服务器的"no matching..."系列算法协商失败问题 摘要&#xff1a; 近期&#xff0c;在使用较新版本的OpenSSH客户端连接老旧SSH服务器时&#xff0c;会遇到 "no matching key exchange method found"​, "n…...

Python+ZeroMQ实战:智能车辆状态监控与模拟模式自动切换

目录 关键点 技术实现1 技术实现2 摘要&#xff1a; 本文将介绍如何利用Python和ZeroMQ消息队列构建一个智能车辆状态监控系统。系统能够根据时间策略自动切换驾驶模式&#xff08;自动驾驶、人工驾驶、远程驾驶、主动安全&#xff09;&#xff0c;并通过实时消息推送更新车…...

十九、【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建

【用户管理与权限 - 篇一】后端基础:用户列表与角色模型的初步构建 前言准备工作第一部分:回顾 Django 内置的 `User` 模型第二部分:设计并创建 `Role` 和 `UserProfile` 模型第三部分:创建 Serializers第四部分:创建 ViewSets第五部分:注册 API 路由第六部分:后端初步测…...

离线语音识别方案分析

随着人工智能技术的不断发展&#xff0c;语音识别技术也得到了广泛的应用&#xff0c;从智能家居到车载系统&#xff0c;语音识别正在改变我们与设备的交互方式。尤其是离线语音识别&#xff0c;由于其在没有网络连接的情况下仍然能提供稳定、准确的语音处理能力&#xff0c;广…...