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

20_HTML5 SSE --[HTML5 API 学习之旅]

HTML5 Server-Sent Events (SSE) 是一种技术,它允许服务器向浏览器推送更新。与传统的轮询不同,SSE提供了真正的单向实时通信通道:服务器可以主动发送数据到客户端,而不需要客户端发起请求。这对于实现实时更新的应用非常有用,比如股票行情、社交网络更新、聊天应用等。

SSE 的特点

  • 单向通信:服务器到客户端的通信是单向的,客户端不能通过同一个连接向服务器发送信息。
  • 自动重连:如果连接断开,浏览器会自动尝试重新建立连接。
  • 简单性:相比WebSocket,SSE更简单,因为它基于HTTP协议,并且不需要额外的握手过程。
  • 事件驱动:服务器可以通过发送特定格式的消息来触发客户端上的事件处理函数。

SSE 的基本语法

服务器端

服务器需要设置正确的HTTP响应头,并使用特定的格式发送消息给客户端:

Content-Type: text/event-stream
Cache-Control: no-cache
Connection: keep-alivedata: This is a message\n\n

每个消息以data:开头,后面跟着消息内容,最后用两个换行符(\n\n)结束。此外,还可以发送其他类型的指令,如event:指定事件类型或id:设置事件ID。

客户端

在客户端,使用JavaScript中的EventSource对象来接收来自服务器的消息:

if(typeof(EventSource)!=="undefined") {var source = new EventSource("/events");source.onmessage = function(event) {console.log("New message:", event.data);};source.onerror = function(event) {console.error("Error occurred:", event);};
} else {console.log("Your browser does not support server-sent events.");
}

示例:

下面是五个使用HTML5 Server-Sent Events (SSE) 从Gin框架中获取信息的完整示例,每个示例展示了不同的应用场景。这些示例包括了从简单的计数器更新到更复杂的实时通知系统和动态数据推送。

示例1: 简单计数器更新

服务器端(Go + Gin)代码:

文件:main.go

package mainimport ("fmt""net/http""time""github.com/gin-gonic/gin"
)func main() {r := gin.Default()// 加载HTML模板文件夹中的所有HTML文件,以便可以在响应中使用这些模板。// 这里假设HTML文件位于项目根目录下的"templates"文件夹中。r.LoadHTMLGlob("templates/*")// 定义根路径"/"的GET请求处理器。// 当用户访问根URL时,将渲染并返回"index.html"模板。r.GET("/", func(c *gin.Context) {c.HTML(http.StatusOK, "index.html", nil)})// 定义处理SSE事件的GET请求处理器,路径为"/events"。r.GET("/events", func(c *gin.Context) {// 设置HTTP响应头以支持SSE。// Content-Type设置为"text/event-stream"表示这是一个SSE流。// Cache-Control设置为"no-cache"防止浏览器缓存数据。// Connection设置为"keep-alive"保持连接打开。c.Header("Content-Type", "text/event-stream")c.Header("Cache-Control", "no-cache")c.Header("Connection", "keep-alive")// 检查ResponseWriter是否实现了Flusher接口,确保可以实时发送数据。flusher, ok := c.Writer.(http.Flusher)if !ok {http.Error(c.Writer, "Streaming unsupported!", http.StatusInternalServerError)return}// 开始一个循环来模拟服务器向客户端发送20条消息。for i := 0; i < 20; i++ { // 发送20条消息// 构建要发送的消息,格式为"data: [message]\n\n"。message := fmt.Sprintf("data: %d\n\n", i)c.Writer.WriteString(message)// 调用Flush()方法立即将缓冲区的数据发送给客户端。flusher.Flush()// 每次发送消息后暂停1秒,模拟延迟。time.Sleep(time.Second)// 如果客户端断开了连接(例如关闭了页面),则退出循环。if c.Writer.Size() == 0 {break}}})// 启动HTTP服务器,监听8080端口。// Gin框架默认在0.0.0.0上监听,意味着可以从任何网络接口访问该服务。r.Run(":8080") // 监听并在 0.0.0.0:8080 上启动服务
}
客户端(HTML + JavaScript)代码:

文件:templates/index.html

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><!-- 设置文档的字符编码为UTF-8 --><title>SSE Counter</title><!-- 设置页面标题 -->
</head>
<body><h1>Counter:</h1><!-- 显示计数器标题 --><p id="counter">0</p><!-- 显示计数器数值,初始值设置为0 --><script type="text/javascript">// 检查浏览器是否支持Server-Sent Events (SSE)if(typeof(EventSource)!=="undefined") {// 创建一个新的EventSource对象,连接到服务器端点"/events"var source = new EventSource("/events");// 当从服务器接收到消息时触发此函数source.onmessage = function(event) {// 更新页面中ID为"counter"的<p>元素的内容为接收到的消息数据document.getElementById("counter").innerHTML = event.data;};// 如果发生错误(例如连接断开),触发此函数source.onerror = function(event) {console.error("Error occurred:", event);// 可选:关闭事件源以防止进一步尝试重新连接// source.close();};} else {// 如果浏览器不支持SSE,则显示提示信息document.getElementById("counter").innerHTML = "Sorry, your browser does not support server-sent events.";}</script><!-- 该脚本块用于与服务器建立SSE连接,并根据接收的数据更新页面上的计数器 -->
</body>
</html>

在这里插入图片描述

示例2: 实时通知系统

服务器端(Go + Gin)代码:

文件:main.go

package mainimport ("fmt""net/http""sync""time""github.com/gin-gonic/gin"
)// 定义一个互斥锁,用于在广播通知时同步对clients的访问。
var mu sync.Mutex// clients是一个保存所有客户端连接的映射,键是客户端的通信信道,值是一个布尔值表示状态。
var clients = make(map[chan string]bool)// broadcastNotification向所有连接的客户端广播通知消息。
func broadcastNotification(msg string) {// 加锁以确保并发安全。mu.Lock()defer mu.Unlock()// 遍历所有客户端,向它们发送消息。for client := range clients {client <- msg}
}// handleEvents处理客户端的事件流请求,保持连接开放并实时发送事件数据。
func handleEvents(c *gin.Context) {// 设置响应头,指明这是一个事件流。c.Header("Content-Type", "text/event-stream")c.Header("Cache-Control", "no-cache")c.Header("Connection", "keep-alive")// 创建一个信道,用于向该客户端发送消息。clientChan := make(chan string)defer close(clientChan)// 加锁以确保并发安全。mu.Lock()clients[clientChan] = truemu.Unlock()// 检查是否支持Flush操作。flusher, ok := c.Writer.(http.Flusher)if !ok {http.Error(c.Writer, "Streaming unsupported!", http.StatusInternalServerError)return}// 启动一个goroutine监听clientChan,并向客户端发送数据。go func() {for msg := range clientChan {c.Writer.WriteString(fmt.Sprintf("data: %s\n\n", msg))flusher.Flush()}}()// 保持连接开放,定期检查客户端是否还在线。for {time.Sleep(time.Second)if _, err := c.Writer.Write([]byte{}); err != nil {delete(clients, clientChan)break}}
}// main是程序的入口点,初始化Gin框架并设置路由。
func main() {r := gin.Default()r.LoadHTMLGlob("templates/*")// 定义根路径"/"的GET请求处理器。// 当用户访问根URL时,将渲染并返回"index.html"模板。r.GET("/", func(c *gin.Context) {c.HTML(http.StatusOK, "index.html", nil)})// 定义"/events"的GET请求处理器,用于处理事件流。r.GET("/events", handleEvents)// 启动一个goroutine定期生成通知消息并广播。go func() {for i := 0; ; i++ {time.Sleep(3 * time.Second)broadcastNotification(fmt.Sprintf("New Notification %d", i))}}()// 启动HTTP服务器,监听8080端口。r.Run(":8080")
}
客户端(HTML + JavaScript)代码:

文件:templates/index.html

<!DOCTYPE html>
<html lang="en">
<head>
<!-- 定义文档的字符编码 -->
<meta charset="UTF-8">
<!-- 设置网页的标题 -->
<title>Real-time Notifications</title>
</head>
<body>
<!-- 显示通知列表的标题 -->
<h1>Notifications:</h1>
<!-- 动态添加通知的容器 -->
<ul id="notifications"></ul><script type="text/javascript">
// 检查浏览器是否支持EventSource接口
if(typeof(EventSource)!=="undefined") {// 创建EventSource对象,连接到服务器的事件流var source = new EventSource("/events");// 监听来自服务器的消息事件source.onmessage = function(event) {// 创建一个新的<li>元素来显示通知var li = document.createElement("li");// 设置<li>元素的文本内容为接收到的消息数据li.textContent = event.data;// 将新的通知添加到通知列表中document.getElementById("notifications").appendChild(li);};
} else {// 如果浏览器不支持EventSource,显示提示信息document.write("Sorry, your browser does not support server-sent events.");
}
</script>
</body>
</html>

在这里插入图片描述

示例3: 动态天气更新

服务器端(Go + Gin)代码:

文件:main.go

package mainimport ("fmt""net/http""time""github.com/gin-gonic/gin"
)// getWeatherData 获取天气数据。在实际应用中,这个函数应该与天气服务API交互以获取实时数据。
// 返回值: 一个描述天气的字符串。
func getWeatherData() string {// 这里应该有一个函数来获取实际的天气数据return "Sunny with a chance of meatballs."
}// main 是程序的入口点。它设置了一个Gin路由器,配置了两个GET请求的处理器,并启动了服务器。
func main() {r := gin.Default()r.LoadHTMLGlob("templates/*")// 定义根路径"/"的GET请求处理器。// 当用户访问根URL时,将渲染并返回"index.html"模板。r.GET("/", func(c *gin.Context) {c.HTML(http.StatusOK, "index.html", nil)})// 定义"/weather"路径的GET请求处理器。// 该处理器通过Server-Sent Events (SSE)每5分钟向客户端发送一次天气更新。r.GET("/weather", func(c *gin.Context) {c.Header("Content-Type", "text/event-stream")c.Header("Cache-Control", "no-cache")c.Header("Connection", "keep-alive")flusher, ok := c.Writer.(http.Flusher)if !ok {http.Error(c.Writer, "Streaming unsupported!", http.StatusInternalServerError)return}for {data := getWeatherData()c.Writer.WriteString(fmt.Sprintf("data: %s\n\n", data))flusher.Flush()time.Sleep(5 * time.Minute) // 每五分钟更新一次if c.Writer.Size() == 0 {break}}})// 启动HTTP服务器,监听8080端口。r.Run(":8080")
}
客户端(HTML + JavaScript)代码:

文件:templates/index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Dynamic Weather Updates</title>
</head>
<body>
<h1>Weather:</h1>
<p id="weather">Loading...</p><script type="text/javascript">
if(typeof(EventSource)!=="undefined") {var source = new EventSource("/weather");source.onmessage = function(event) {document.getElementById("weather").innerHTML = event.data;};
} else {document.getElementById("weather").innerHTML = "Your browser does not support server-sent events.";
}
</script>
</body>
</html>

在这里插入图片描述

示例4: 聊天室消息推送

服务器端(Go + Gin)代码:

文件:main.go

package mainimport ("fmt""net/http""sync""time""github.com/gin-gonic/gin"
)// messages 存储聊天消息。
var messages []string// mu 用于保护 messages 切片的并发访问安全。
var mu sync.Mutex// addMessage 向消息列表中添加新消息。
// 该函数通过 mu 锁确保并发安全。
func addMessage(msg string) {mu.Lock()defer mu.Unlock()messages = append(messages, msg)
}func main() {r := gin.Default()r.LoadHTMLGlob("templates/*")// 定义根路径"/"的GET请求处理器。// 当用户访问根URL时,将渲染并返回"index.html"模板。r.GET("/", func(c *gin.Context) {c.HTML(http.StatusOK, "index.html", nil)})// 处理"/chat"的GET请求,以Server-Sent Events(SSE)形式发送聊天消息。// 该处理器持续运行,每秒向客户端推送一次消息,直到连接关闭。r.GET("/chat", func(c *gin.Context) {c.Header("Content-Type", "text/event-stream")c.Header("Cache-Control", "no-cache")c.Header("Connection", "keep-alive")flusher, ok := c.Writer.(http.Flusher)if !ok {http.Error(c.Writer, "Streaming unsupported!", http.StatusInternalServerError)return}for {mu.Lock()msgs := messagesmu.Unlock()for _, msg := range msgs {c.Writer.WriteString(fmt.Sprintf("data: %s\n\n", msg))flusher.Flush()}time.Sleep(time.Second)if c.Writer.Size() == 0 {break}}})// 处理"/send"的POST请求,用于接收客户端发送的新消息。// 从请求中提取"message"字段,并将其添加到消息列表中。r.POST("/send", func(c *gin.Context) {msg := c.PostForm("message")addMessage(msg)})// 启动HTTP服务器,监听端口为8080。r.Run(":8080")
}
客户端(HTML + JavaScript)代码:

文件:templates/index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Chat Room</title>
</head>
<body>
<h1>Chat Room:</h1>
<ul id="messages"></ul>
<form id="chat-form"><input type="text" name="message" placeholder="Type a message..." required /><button type="submit">Send</button>
</form><script type="text/javascript">
// 检查浏览器是否支持EventSource
if(typeof(EventSource)!=="undefined") {// 创建EventSource实例,建立到服务器的连接var source = new EventSource("/chat");// 监听服务器发送的消息事件source.onmessage = function(event) {// 创建一个新的li元素var li = document.createElement("li");// 将服务器发送的数据设置为li元素的文本内容li.textContent = event.data;// 将li元素添加到页面上的messages元素中document.getElementById("messages").appendChild(li);};// 监听表单的提交事件document.getElementById("chat-form").addEventListener("submit", function(event) {// 阻止默认的表单提交行为event.preventDefault();// 创建FormData实例,用于处理表单数据var formData = new FormData(event.target);// 使用fetch API发送POST请求到服务器fetch('/send', {method: 'POST',body: formData,}).then(response => {// 如果服务器响应成功,重置表单if (response.ok) {event.target.reset();}});});
} else {// 如果浏览器不支持EventSource,显示提示信息document.write("Sorry, your browser does not support server-sent events.");
}
</script>
</body>
</html>

在这里插入图片描述

示例5: 实时股票价格更新

服务器端(Go + Gin)代码:

文件:main.go

package mainimport ("fmt""math/rand""net/http""time""github.com/gin-gonic/gin"
)// getRandomStockPrice 生成一个随机的股票价格。
// 假设股票价格在100到200之间。
func getRandomStockPrice() float64 {return rand.Float64()*100 + 100
}func main() {r := gin.Default()r.LoadHTMLGlob("templates/*")// 定义根路径"/"的GET请求处理器。// 当用户访问根URL时,将渲染并返回"index.html"模板。r.GET("/", func(c *gin.Context) {c.HTML(http.StatusOK, "index.html", nil)})// 处理"/stock"的GET请求,通过Server-Sent Events (SSE) 实时推送股票价格。r.GET("/stock", func(c *gin.Context) {c.Header("Content-Type", "text/event-stream")c.Header("Cache-Control", "no-cache")c.Header("Connection", "keep-alive")// 检查响应写入器是否支持flush操作。flusher, ok := c.Writer.(http.Flusher)if !ok {http.Error(c.Writer, "Streaming unsupported!", http.StatusInternalServerError)return}// 创建一个定时器,每10秒发送一次股票价格。ticker := time.NewTicker(10 * time.Second)defer ticker.Stop()for {select {case <-ticker.C:// 生成新的股票价格并发送到客户端。price := getRandomStockPrice()c.Writer.WriteString(fmt.Sprintf("data: %.2f\n\n", price))flusher.Flush()// 如果响应内容为空,则终止循环。if c.Writer.Size() == 0 {return}}}})// 启动HTTP服务器,监听端口8080。r.Run(":8080")
}
客户端(HTML + JavaScript)代码:

文件:templates/index.html

<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>Live Stock Price</title>
</head>
<body>
<h1>Stock Price:</h1>
<p id="price">Loading...</p><script type="text/javascript">
if(typeof(EventSource)!=="undefined") {var source = new EventSource("/stock");source.onmessage = function(event) {document.getElementById("price").innerHTML = "$" + event.data;};
} else {document.getElementById("price").innerHTML = "Your browser does not support server-sent events.";
}
</script>
</body>
</html>

在这里插入图片描述

这些示例涵盖了从简单到复杂的不同SSE应用场景。你可以根据自己的需求调整和扩展这些例子,以适应特定的业务逻辑或功能要求。

测试代码下载

html5_api代码

相关文章:

20_HTML5 SSE --[HTML5 API 学习之旅]

HTML5 Server-Sent Events (SSE) 是一种技术&#xff0c;它允许服务器向浏览器推送更新。与传统的轮询不同&#xff0c;SSE提供了真正的单向实时通信通道&#xff1a;服务器可以主动发送数据到客户端&#xff0c;而不需要客户端发起请求。这对于实现实时更新的应用非常有用&…...

jetson Orin nx + yolov8 TensorRT 加速量化 环境配置

参考【Jetson】Jetson Orin NX纯系统配置环境-CSDN博客 一 系统环境配置&#xff1a; 1.更换源&#xff1a; sudo vi /etc/apt/sources.list.d/nvidia-l4t-apt-source.list2.更新源&#xff1a; sudo apt upgradesudo apt updatesudo apt dist-upgrade sudo apt-get updat…...

Android Studio IDE环境配置

​需要安装哪些东西&#xff1a; Java jdk Java Downloads | OracleAndroid Studio 下载 Android Studio 和应用工具 - Android 开发者 | Android DevelopersAndroid Sdk 现在的Android Studio版本安装时会自动安装&#xff0c;需要注意下安装的路径Android Studio插件…...

PTA 7-2 0/1背包问题(回溯法) 作者 王东 单位 贵州师范学院

0/1背包问题。给定一载重量为W的背包及n个重量为wi、价值为vi的物体&#xff0c;1≤i≤n,要求重量和恰好为W具有最大的价值。 输入格式: 第一行输入背包载重量W及背包个数n&#xff0c;再依次输入n行&#xff0c;每行为背包重量wi和价值vi。 输出格式: 第一行输出装入背包内…...

Matlab环形柱状图

数据准备&#xff1a; 名称 数值 Aa 21 Bb 23 Cc 35 Dd 47 保存为Excel文件后&#xff1a; % Load data from Excel file filename data.xlsx; % Ensure the file is in the current folder or provide full path dataTable readtable(filena…...

【AI大模型】探索GPT模型的奥秘:引领自然语言处理的新纪元

目录 &#x1f354; GPT介绍 &#x1f354; GPT的架构 &#x1f354; GPT训练过程 3.1 无监督的预训练语言模型 3.2 有监督的下游任务fine-tunning &#x1f354; 小结 学习目标 了解什么是GPT.掌握GPT的架构.掌握GPT的预训练任务. &#x1f354; GPT介绍 GPT是OpenAI公…...

5.Python爬虫相关

爬虫 爬虫原理 爬虫&#xff0c;又称网络爬虫&#xff0c;是一种自动获取网页内容的程序。它模拟人类浏览网页的行为&#xff0c;发送HTTP请求&#xff0c;获取网页源代码&#xff0c;再通过解析、提取等技术手段&#xff0c;获取所需数据。 HTTP请求与响应过程 爬虫首先向…...

Windows系统上配置eNSP环境的详细步骤

华为eNSP&#xff08;Enterprise Network Simulation Platform&#xff09;是一款针对华为数通网络设备的网络仿真平台&#xff0c;用于辅助工程师进行网络技术学习、方案验证和故障排查等工作。以下是在Windows系统上配置eNSP环境的详细步骤&#xff1a; 1. 准备工作 下载安…...

Database.NET——一款轻量级多数据库客户端工具

文章目录 Database.NET简介下载使用使用场景总结 Database.NET简介 Database.NET 是一个功能强大且易于使用的数据库管理工具&#xff0c;适用于多种数据库系统。它为开发者和数据库管理员提供了一个统一的界面&#xff0c;可以方便地管理和操作不同类型的数据库。 支持的数据…...

新浪微博C++面试题及参考答案

多态是什么&#xff1f;请详细解释其实现原理&#xff0c;例如通过虚函数表实现。 多态是面向对象编程中的一个重要概念&#xff0c;它允许不同的对象对同一消息或函数调用做出不同的响应&#xff0c;使得程序具有更好的可扩展性和灵活性。 在 C 中&#xff0c;多态主要通过虚函…...

计算机视觉目标检测-1

文章目录 摘要Abstract1.目标检测任务描述1.1 目标检测分类算法1.2 目标定位的简单实现思路1.2.1 回归位置 2.R-CNN2.1 目标检测-Overfeat模型2.1.1 滑动窗口 2.2 目标检测-RCNN模型2.2.1 非极大抑制&#xff08;NMS&#xff09; 2.3 目标检测评价指标 3.SPPNet3.1 spatial pyr…...

【物联网技术与应用】实验15:电位器传感器实验

实验15 电位器传感器实验 【实验介绍】 电位器可以帮助控制Arduino板上的LED闪烁的时间间隔。 【实验组件】 ● Arduino Uno主板* 1 ● 电位器模块* 1 ● USB电缆*1 ● 面包板* 1 ● 9V方型电池* 1 ● 跳线若干 【实验原理】 模拟电位器是模拟电子元件&#xff0c;模…...

java常用类(上)

笔上得来终觉浅,绝知此事要躬行 &#x1f525; 个人主页&#xff1a;星云爱编程 &#x1f525; 所属专栏&#xff1a;javase &#x1f337;追光的人&#xff0c;终会万丈光芒 &#x1f389;欢迎大家点赞&#x1f44d;评论&#x1f4dd;收藏⭐文章 目录 一、包装类 1.1包装类…...

包管理工具npm、yarn、pnpm、cnpm详解

1. 包管理工具 1.1 npm # 安装 $ node 自带 npm# 基本用法 npm install package # 安装包 npm install # 安装所有依赖 npm install -g package # 全局安装 npm uninstall package # 卸载包 npm update package # 更新包 npm run script #…...

CI/CD是什么?

CI/CD 定义 CI/CD 代表持续集成和持续部署&#xff08;或持续交付&#xff09;。它是一套实践和工具&#xff0c;旨在通过自动化构建、测试和部署来改进软件开发流程&#xff0c;使您能够更快、更可靠地交付代码更改。 持续集成 (CI)&#xff1a;在共享存储库中自动构建、测试…...

[Java]合理封装第三方工具包(附视频)

-1.视频链接 视频版: 视频版会对本文章内容进行详细解释 [Java]合理封装第三方工具包_哔哩哔哩_bilibili 0.核心思想 对第三方工具方法进行封装,使其本地化,降低记忆和使用成本 1.背景 在我们的项目中,通常会引用一些第三方工具包,或者是使用jdk自带的一些工具类 例如: c…...

常规配置、整合IDEA

目录 Redis常规配置 tcp-keepalive security Jedis RedisTemplate 连接池技术 Lua脚本 Jedis集群 Redis应用问题&解决方案 缓存穿透 缓存击穿 缓存雪崩 分布式锁 Redis实现分布式锁 Redis新功能 ACL Redis常规配置 tcp-keepalive security redis.conf中…...

用Python写炸金花游戏

文章目录 **代码分解与讲解**1. **扑克牌的生成与洗牌**2. **给玩家发牌**3. **打印玩家的手牌**4. **定义牌的优先级**5. **判断牌型**6. **确定牌型优先级**7. **比较两手牌的大小**8. **计算每个玩家的牌型并找出赢家**9. **打印结果** 完整代码 以下游戏规则&#xff1a; 那…...

计算机的错误计算(一百九十二)

摘要 用两个大模型计算 csc(0.999), 其中&#xff0c;0.999是以弧度为单位的角度&#xff0c;结果保留5位有效数字。两个大模型均给出了 Python代码与答案。但是&#xff0c;答案是错误的。 例1. 计算 csc(0.999), 其中&#xff0c;0.999是以弧度为单位的角度&#xff0c;结…...

37 Opencv SIFT 特征检测

文章目录 Ptr<SIFT> SIFT::create示例 Ptr SIFT::create Ptr<SIFT> SIFT::create(int nfeatures 0,int nOctaveLayers 3,double contrastThreshold 0.04,double edgeThreshold 10,double sigma 1.6 );参数说明&#xff1a;nfeatures&#xff1a;类型&#x…...

RestClient

什么是RestClient RestClient 是 Elasticsearch 官方提供的 Java 低级 REST 客户端&#xff0c;它允许HTTP与Elasticsearch 集群通信&#xff0c;而无需处理 JSON 序列化/反序列化等底层细节。它是 Elasticsearch Java API 客户端的基础。 RestClient 主要特点 轻量级&#xff…...

挑战杯推荐项目

“人工智能”创意赛 - 智能艺术创作助手&#xff1a;借助大模型技术&#xff0c;开发能根据用户输入的主题、风格等要求&#xff0c;生成绘画、音乐、文学作品等多种形式艺术创作灵感或初稿的应用&#xff0c;帮助艺术家和创意爱好者激发创意、提高创作效率。 ​ - 个性化梦境…...

【根据当天日期输出明天的日期(需对闰年做判定)。】2022-5-15

缘由根据当天日期输出明天的日期(需对闰年做判定)。日期类型结构体如下&#xff1a; struct data{ int year; int month; int day;};-编程语言-CSDN问答 struct mdata{ int year; int month; int day; }mdata; int 天数(int year, int month) {switch (month){case 1: case 3:…...

SciencePlots——绘制论文中的图片

文章目录 安装一、风格二、1 资源 安装 # 安装最新版 pip install githttps://github.com/garrettj403/SciencePlots.git# 安装稳定版 pip install SciencePlots一、风格 简单好用的深度学习论文绘图专用工具包–Science Plot 二、 1 资源 论文绘图神器来了&#xff1a;一行…...

线程与协程

1. 线程与协程 1.1. “函数调用级别”的切换、上下文切换 1. 函数调用级别的切换 “函数调用级别的切换”是指&#xff1a;像函数调用/返回一样轻量地完成任务切换。 举例说明&#xff1a; 当你在程序中写一个函数调用&#xff1a; funcA() 然后 funcA 执行完后返回&…...

STM32F4基本定时器使用和原理详解

STM32F4基本定时器使用和原理详解 前言如何确定定时器挂载在哪条时钟线上配置及使用方法参数配置PrescalerCounter ModeCounter Periodauto-reload preloadTrigger Event Selection 中断配置生成的代码及使用方法初始化代码基本定时器触发DCA或者ADC的代码讲解中断代码定时启动…...

《通信之道——从微积分到 5G》读书总结

第1章 绪 论 1.1 这是一本什么样的书 通信技术&#xff0c;说到底就是数学。 那些最基础、最本质的部分。 1.2 什么是通信 通信 发送方 接收方 承载信息的信号 解调出其中承载的信息 信息在发送方那里被加工成信号&#xff08;调制&#xff09; 把信息从信号中抽取出来&am…...

论文解读:交大港大上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架(一)

宇树机器人多姿态起立控制强化学习框架论文解析 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化学习框架&#xff08;一&#xff09; 论文解读&#xff1a;交大&港大&上海AI Lab开源论文 | 宇树机器人多姿态起立控制强化…...

土地利用/土地覆盖遥感解译与基于CLUE模型未来变化情景预测;从基础到高级,涵盖ArcGIS数据处理、ENVI遥感解译与CLUE模型情景模拟等

&#x1f50d; 土地利用/土地覆盖数据是生态、环境和气象等诸多领域模型的关键输入参数。通过遥感影像解译技术&#xff0c;可以精准获取历史或当前任何一个区域的土地利用/土地覆盖情况。这些数据不仅能够用于评估区域生态环境的变化趋势&#xff0c;还能有效评价重大生态工程…...

在鸿蒙HarmonyOS 5中使用DevEco Studio实现录音机应用

1. 项目配置与权限设置 1.1 配置module.json5 {"module": {"requestPermissions": [{"name": "ohos.permission.MICROPHONE","reason": "录音需要麦克风权限"},{"name": "ohos.permission.WRITE…...