flask-socketio相关总结
flask-socketio是一个为flask应用程序添加的实时双向通信功能的扩展库,有了这个库,就可以在flask应用中应用websocket协议,帮助flask实现低延迟、双向的客户端、服务端通信。客户端通过任何SocketIO官方库,都能与服务器建立长连接。
文章目录
- 1、HTTP与WebSocket区别
- 2、flask-socketio使用
- 2.1 安装
- 2.2 关于异步服务的依赖
- 2.3 flask-socketio简单使用
- 2.4 服务端接收消息
- 2.5 服务器发送消息
- 2.6 广播
- 2.7 房间
- 2.8 连接事件
- 2.9 部署
- 2.10 跨域问题
1、HTTP与WebSocket区别
HTTP与WebSocket是两种在网络通信中广泛使用的协议,它们各自具有独特的特点和适用场景。
- HTTP
定义: HTTP(Hyper Text Transfer Protocol,超文本传输协议)是一个简单的请求-响应协议,通常运行在TCP之上。
特点: HTTP是基于客户/服务器模式,客户与服务器建立连接后,客户向服务器提出请求,服务器接受请求并作出应答,然后客户与服务器关闭连接。这种连接是一次性的,并且是单向无状态的,每次连接只处理一个请求。HTTP协议传输的数据通常是文本或二进制数据。
适用场景: 适用于一次性、不会高频更新的数据传输场景,如网页浏览、图片加载等;且由于是无状态协议,因此也非常适合处理大量并发请求,如Web服务器对多个用户的请求进行处理。 - WebSocket
定义: WebSocket是一种在单个TCP连接上进行全双工通信的协议。
特点: WebSocket需要浏览器和服务器握手建立连接。一旦连接建立,客户端和服务器可以双向通信,即服务器可以主动向客户端推送信息,客户端也可以主动向服务器发送信息。且这种连接是有状态的,连接建立后,客户端和服务器之间的连接将保持活动状态,直到被任何一方(客户端或服务器)终止。WebSocket协议可以传输任意格式的数据,包括文本、二进制、JSON等。
适用场景: 适用于需要实时性、高频更新的数据传输场景,如在线聊天室、实时股票行情、在线游戏等。由于WebSocket支持双向通信和持久连接,因此非常适合处理需要实时交互的应用场景。
下图是WebSocket与HTTP协议工作图示区别(图片来自迷途小书童的Note):
2、flask-socketio使用
flask-socketio官方文档链接:https://flask-socketio.readthedocs.io/en/latest/
2.1 安装
flask-socketio可通过pip快速安装:
pip install flask-socketio
2.2 关于异步服务的依赖
flask-socketio需要底层异步服务器的支持,而且会自己根据当前环境存在的异步服务自动选择,可供选择的服务框架有三种,顺序为:eventlet > gevent > werkzeug
- eventlet,性能最好,支持长轮询和Websocket协议,通过
pip install eventlet
安装。 - gevent,它能支持多样设置,gevent支持长轮询方式,但是不支持原生WebSocket,为了能支持原生WebSocket,需要选取如下两种方案,一是通过命令
pip install gevent-websocket
安装gevent-websocket
库为gevent增加WebSocket支持;二是使用带有WebSocket功能的uWSGI Web服务器。性能方面,gevent表现不错,但不如eventlet。 - 使用基于werkzeug的flask开发服务器,但需要注意的是,它缺乏其他两个选项的性能,因此只应用于简单的开发环境,而且它也仅支持长轮询传输。
2.3 flask-socketio简单使用
首先创建flask应用实例,然后初始化flask-socketio扩展,接着定义事件处理函数,并使用@socketio.on装饰器来监听特定的事件,最后启动应用时,使用socketio.run()来代替app.run()。代码如下:
from flask import Flask, render_template
from flask_socketio import SocketIO, emit
import timeapp = Flask(__name__)
app.config['SECRET_KEY'] = 'secret'
socketio = SocketIO()
socketio.init_app(app)@app.route('/')
def index():"""demo page"""return render_template('index.html') # 用于展示逐字打印效果的网页@socketio.on('start_stream')
def start_stream():text = "这是一段要逐步返回的文字"for char in text:emit('new_char', char)time.sleep(1)if __name__ == '__main__':socketio.run(app, port=5002, debug=True)
前端代码必须加载http://Socket.IO库,并建立连接:
<!DOCTYPE html>
<html><head><script src="https://cdnjs.cloudflare.com/ajax/libs/socket.io/4.7.2/socket.io.min.js"></script>
</head><body><div id="result"></div><script>const socket = io.connect('http://localhost:5002');socket.on('connect', function () {socket.emit('connect success.');});socket.on('new_char', function (char) {if (char) {document.getElementById('result').innerHTML += char;}});</script>
</body></html>
2.4 服务端接收消息
当使用SocketIO时,消息被双方作为事件接收。前端发送消息时,服务端需要为这些事件注册处理程序。
- 下面是服务端为一些未命名事件的处理程序:
@socketio.on('message')
def handle_message(data):print('received message: ' + data) # 未命名事件使用字符串消息@socketio.on('json')
def handle_json(json):print('received json: ' + str(json)) # 未命名事件使用json数据
- 最灵活的事件类型使用自定义事件名称
# 最灵活的事件类型使用自定义事件名称,比如这里的‘my event’。这些事件的消息数据可以是字符串、字节、int或JSON
@socketio.on('my event')
def handle_my_custom_event(json):print('received json: ' + str(json))# 自定义命名事件也可以支持多个参数
@socketio.on('my_event')
def handle_my_custom_event(arg1, arg2, arg3):print('received args: ' + arg1 + arg2 + arg3)
- 当装饰的函数名符合python命名规则且不与其他python标识符冲突时,可以用socketio.event装饰器
# 当装饰的函数名符合python命名规则且不与其他python标识符冲突时,可以用socketio.event装饰器,这时不需要指定事件的元数据类型
# 名称message、json、connect和disconnect是保留的,因此不能用于命名事件。
@socketio.event
def my_custom_event(arg1, arg2, arg3):print('received args: ' + arg1 + arg2 + arg3)
- 命名空间,namespace
# flask-socketio还支持命名空间,所以在不同命名空间下,可以定义相同的事件名,它们不冲突。
# 若未指定命名空间,则使用名称为‘/’的默认全局命名空间
@socketio.on('my event', namespace='/test')
def handle_my_custom_namespace_event(json):print('received json: ' + str(json))
- 若不想使用装饰器,用socketio的on_event方法调用实现消息的处理
# 不用装饰器语法也可以,用socketio的on_event方法调用实现消息的处理
def my_function_handler(data):passsocketio.on_event('my event', my_function_handler, namespace='/test')
- 客户端如何确认服务器已经收到了它们发的消息
# 从处理函数返回的任何值都将作为回调函数的参数传递给客户端
# 下面例子中,客户端回调函数将被调用两个参数,‘one’和2。如果处理程序函数不返回任何值,则调用客户端回调函数时不带参数。
@socketio.on('my event')
def handle_my_custom_event(json):print('received json: ' + str(json))return 'one', 2
2.5 服务器发送消息
SocketIO事件处理程序可以使用send()和emit()函数向连接的客户端发送消息。
- 下面是一些简单的例子,将服务端接收到前端发来的消息再发送回去。其中send用于未命名事件,emit用于命名事件。
from flask_socketio import send, emit@socketio.on('message')
def handle_message(message):send(message)@socketio.on('json')
def handle_json(json):send(json, json=True)@socketio.on('my event')
def handle_my_custom_event(json):emit('my response', json)
- 命名空间(namespace),Send()和emit()默认使用传入消息的名称空间,当然也可以指定另外不同的命名空间。
@socketio.on('message')
def handle_message(message):send(message, namespace='/chat')@socketio.on('my event')
def handle_my_custom_event(json):emit('my response', json, namespace='/chat')
- 要用元组包含发送带有多个参数的事件
@socketio.on('my event')
def handle_my_custom_event(json):emit('my response', ('foo', 'bar', json), namespace='/chat')
- 服务端如何确认客户器已经收到了它们发的消息
def ack():print('message was received!')@socketio.on('my event')
def handle_my_custom_event(json):emit('my response', json, callback=ack) # 确认回调
2.6 广播
SocketIO的另一个非常有用的特性是消息广播。Flask-SocketIO通过send()和emit()的可选参数broadcast=True来支持此功能。广播功能开启时,所有连接这个命名空间的客户端(包括发送者在内)都会收到这个消息。命名空间未指定时,所有连接全局命名空间的客户端会接收消息。注意,广播消息不会触发回调函数。
@socketio.on('my event')
def handle_my_custom_event(data):emit('my response', data, broadcast=True)
- 上面的例子都是服务端在接收到客户端发来的消息事件后作出的响应,服务端如何首先给客户端发送消息。
def some_function():socketio.emit('some event', {'data': 42})
这里的socketio.send() 和socketio.emit()方法不同于处在事件函数上下文中的send() 和emit()。另外,由于是在一个普通函数中,没有客户端上下文信息,所以 broadcast=True是默认的,不必指定。
2.7 房间
实际应用场景中,可能需要给用户分组。比如,聊天室,不同用户只能收到他们所在房间的消息。通过join_room() 和 leave_room() 可以实现上述功能:
from flask_socketio import join_room, leave_room@socketio.on('join')
def on_join(data):username = data['username']room = data['room']join_room(room)send(username + ' has entered the room.', to=room)@socketio.on('leave')
def on_leave(data):username = data['username']room = data['room']leave_room(room)send(username + ' has left the room.', to=room)
send()和emit()函数接受to=room用于把消息发送到指定房间。
所有客户端连接时,会被分配一个房间。默认房间名称为连接的session ID,flask中通过request.sid获取该ID。客户端能加入所有存在的房间。客户端断开时,所有它加入的房间都会移除它。上下文外的socketio.send() 和 socketio.emit()也可以接收room参数,来给房间中所有客户端广播。
2.8 连接事件
连接和断开事件用于验证客户端是否有连接权限
@socketio.on('connect')
def test_connect(auth):emit('my response', {'data': 'Connected'})@socketio.on('disconnect')
def test_disconnect():print('Client disconnected')
连接处理程序中的auth参数是可选的。客户端可以使用它来传递字典格式的令牌等身份验证数据。
2.9 部署
-
内置服务器
最简单的部署方式,就是安装eventlet或gevent,然后调用socketio.run(app)。需要注意的是,socketio.run(app)是用于生产环境的,但前提必须确保eventlet或gevent已经安装;否则只会调用Flask自带的服务器,这个服务器仅限于测试环境使用。 -
Gunicorn服务器
使用gunicorn作为web服务器,使用eventlet或gevent工作线程。需要安装gunicorn,eventlet或者gevent。
通过gunicorn启动eventlet服务器的命令行:gunicorn --worker-class eventlet -w 1 module:app
通过gunicorn启动gevent服务器的命令行:gunicorn -k gevent -w 1 module:app
当使用gunicorn与gevent,而且选择由geevent-WebSocket提供的WebSocket支持时,命令行如下:
gunicorn -k geventwebsocket.gunicorn.workers.GeventWebSocketWorker -w 1 module:app
gunicorn的第三个选择是使用线程工作器,以及用于WebSocket支持的simple-websocket包。对于CPU占用较多的应用程序可以使用:
gunicorn -w 1 --threads 100 module:app
所有这些命令,module是python的定义在应用实例当中的包或模块,app就是应用实例本身。 -
uWSGI服务器
当将uWSGI服务器与gevent结合使用时,Socket.IO服务器可以利用uWSGI的原生WebSocket支持,启动命令如下:
uwsgi --http :5000 --gevent 1000 --http-websockets --master --wsgi-file app.py --callable app
2.10 跨域问题
如果是前后端分离的系统中,就会出现跨域问题,在网络应用开发中,跨域资源共享(Cross Origin Resource Sharing,简称CORS)是一种机制,允许服务器与指定的来源或域名之间共享资源。使用CORS,我们可以灵活地控制不同域之间的数据传输,实现安全、可靠的跨域访问。单纯在flask应用中,可以使用flask-cors扩展库来实现CORS功能。
# 安装: pip install flask-cors
from flask import Flask, jsonify
from flask_cors import CORSapp = Flask(__name__)
CORS(app) # 允许应用的所有视图都可以跨域访问....
但是在app用flask-socketio中,上述方法并不起作用了,我们需要在 socketio 初始化的时候加入必要的参数来实现跨域访问:
socketio = SocketIO()
socketio.init_app(app, cors_allowed_origins='*')
相关文章:
flask-socketio相关总结
flask-socketio是一个为flask应用程序添加的实时双向通信功能的扩展库,有了这个库,就可以在flask应用中应用websocket协议,帮助flask实现低延迟、双向的客户端、服务端通信。客户端通过任何SocketIO官方库,都能与服务器建立长连接…...
每日一题 LCR 097. 不同的子序列
LCR 097. 不同的子序列 使用动态规划就可以解决,重点是知道 动态规划的状态是如何转移的 class Solution { public:int numDistinct(string s, string t) {int ns s.size();int nt t.size();vector<vector<long>> dp(ns1,vector<long>(nt1,0)…...
合并区间C和C++的区别、布尔、整型、浮点、指针类型和0做比较、malloc、calloc、realloc的区别
56. 合并区间 class Solution { public:vector<vector<int>> merge(vector<vector<int>>& intervals) {//先按照每个区间的左元素排序,这样每个区间的左边界就固定了,所以之后考虑相邻的//区间是否是相交的就行 类似与栈的…...
设计模式-外观模式
背景 有一个家庭影院,有DVD播放器,投影仪,屏幕,音响,爆米花机,每一个设备都有一个遥控器。 传统思路: 创建一个客户端类,在这个类中创建所有设备的相关对象(遥控器&am…...
嵌入式驱动开发详解14(SPI驱动架构实现)
文章目录 前言SPI简介SPI介绍SPI工作模式SPI特点 驱动开发驱动架构SPI控制器驱动SPI设备驱动SPI 设备和驱动匹配过程SPI其他相关API函数 参考文献 前言 SPI 是很常用的串行通信协议,可以通过 SPI 来连接众多的传感器,相比 I2C 接 口,SPI 接口…...
【保姆级系列:思科模拟器安装下载汉化教程大全】
文章目录 概述Packet Tracer下载Packet Tracer安装Packet Tracer使用EVE-NG下载:EVE-NG安装:EVE-NG使用: 概述 思科在网络界的地位是众所周知的。如果说在中美科技战中,华为代表CHN,那么思科就代表US,依然…...
2024 一带一路暨金砖国家技能发展与技术创新大赛【网络安全防护治理实战技能赛项】样题(中职组)
2024 一带一路暨金砖国家技能发展与技术创新大赛【网络安全防护治理实战技能赛项】样题(中职组) 1.基础设置和安全强化(xxx 分)1.3. 任务内容: 2.安全监测和预警(xxx 分)2.1. 任务一:建立目录安…...
QT 中基于 TCP 的网络通信
基础 基于 TCP 的套接字通信需要用到两个类: 1)QTcpServer:服务器类,用于监听客户端连接以及和客户端建立连接。 2)QTcpSocket:通信的套接字类,客户端、服务器端都需要使用。 这两个套接字通信类…...
React Native 速度提升 550%
React Native 爱好者们!🌟 您准备好听一些激动人心的消息了吗?React Native 刚刚发布了其最大的更新之一:一种全新的架构,彻底改变了我们构建移动应用程序的方式。如果您想知道这对您的项目和开发体验意味着什么,请继续关注!我们正在深入探讨这个改变游戏规则的事物;您…...
火语言RPA流程组件介绍--键盘按键
🚩【组件功能】:模拟键盘按键 配置预览 配置说明 按键 点击后,在弹出的软键盘上选择需要的按键 执行后等待时间(ms) 默认值300,执行该组件后等待300毫秒后执行下一个组件. 输入输出 输入类型 万能对象类型(System.Object)输出类型 万能对象类型…...
数值分析—数值积分
研究背景 积分的数学解法为牛顿莱布尼兹公式,数学表示为 ∫ a b f ( x ) d x F ( b ) − F ( a ) \int_{a}^{b} f(x)dxF(b)-F(a) ∫abf(x)dxF(b)−F(a),但应用该方法有如下困难: 1, f ( x ) f(x) f(x)的原函数有时不能用初等函…...
Next.js优化教程:优化字体加载
更多有关Next.js教程,请查阅: 【目录】Next.js 独立开发系列教程-CSDN博客 目录 更多有关Next.js教程,请查阅: 前言 1. 字体加载的常见问题 1.1 什么是 FOIT 和 FOUT? 1.2 字体优化的核心目标 2. Next.js 字体优…...
功能篇:springboot中全局异常
在Java应用程序中实现全局异常处理是确保应用健壮性和用户体验良好性的重要一步。通过全局异常处理,你可以集中管理所有未捕获的异常,并以统一的方式响应它们。对于Web应用程序(如使用Spring框架的应用),通常会创建一个…...
【go 】 select case 的用法
文章目录 1. 基本使用:监听多个通道,会阻塞2.带默认分支:非阻塞操作3. 永远监听多个通道4. 超时机制5. 关闭通道的处理6. context的关闭判断 相关文章: 【go】select 语句case的随机性 【go】 select case 超时机制(time.After)示…...
出海服务器可以用国内云防护吗
随着企业国际化进程的加速,越来越多的企业选择将业务部署到海外服务器上,以便更贴近国际市场。然而,海外服务器也面临着来自全球各地的安全威胁和网络攻击。当出海服务器遭受攻击时,是否可以借助国内的云服务器来进行有效的防护呢…...
前端权限控制
前端权限控制 一、路由权限(控制页面访问) vue // router.js const routes [{path: /dashboard,name: Dashboard,component: () > import(/views/Dashboard.vue),meta: { requiresAuth: true, roles: [admin, manager] }},{path: /user,name: Use…...
计算机组成原理(二):指令跳转
指令跳转(Instruction Jump)是计算机程序控制流的重要组成部分,通过改变程序的执行顺序实现循环、条件分支和函数调用等功能。 基本概念 跳转指令主要用来修改**程序计数器(Program Counter, PC)**的值,使…...
LoViT: 用于手术阶段识别的长视频Transformer|文献速递-生成式模型与transformer在医学影像中的应用
Title 题目 LoViT: Long Video Transformer for surgical phase recognition LoViT: 用于手术阶段识别的长视频Transformer 01 文献速递介绍 快速发展的手术数据科学(SDS)领域旨在通过先进利用手术室(OR)内医疗设备采集的数据…...
【传感器技术】第4章 力敏传感器,弹性敏感元件的基本特性,应变式压力传感器,电阻应变片的温度补偿,压阻式压力传感器,压电式压力传感器
关注作者了解更多 我的其他CSDN专栏 过程控制系统 工程测试技术 虚拟仪器技术 可编程控制器 工业现场总线 数字图像处理 智能控制 传感器技术 嵌入式系统 复变函数与积分变换 单片机原理 线性代数 大学物理 热工与工程流体力学 数字信号处理 光电融合集成电路…...
linux之vim
一、模式转换命令 vim主要有三种模式:命令模式(Normal Mode)、输入模式(Insert Mode)和底线命令模式(Command-Line Mode)。 从命令模式切换到输入模式:i:在当前光标所在…...
【LeetCode】每日一题 2024_12_9 判断国际象棋棋盘中一个格子的颜色(找规律)
前言 每天和你一起刷 LeetCode 每日一题~ LeetCode 启动! 题目:判断国际象棋棋盘中一个格子的颜色 最近力扣一直在出棋盘类的题目,这个月已经出了 9 天了,我倒要看看他是不是真能出一个月 代码与解题思路 先读题:题…...
HCL虚拟环境搭建并且支持ssh远程访问
1.连接设备 新建设备和host主机,连线,host主机选择本地网卡(不选host-only网卡) 2.启动设备,打开终端,按ctrlc 3.执行命令 <H3C>system-view [H3C]int g0/0 [H3C-GigabitEthernet0/0]ip address …...
批量验证指定漏洞思路和流程
免责申明 本文仅是用于学习研究POC的地址收集与漏洞验证原理,请勿用在非法途径上,若将其用于非法目的,所造成的一切后果由您自行承担,产生的一切风险和后果与笔者无关;本文开始前请认真详细学习《中华人民共和国网络安全法》【学法时习之丨网络安全在身边一图了解网络安…...
首次打开韦东山提供的Ubuntu-18.04镜像后,该做哪些事?
目录 01-测试有无网络02-配置最基本的嵌入式开发环境(安装tftp-nfs等)03-缩短关机强制结束进行时间04-关闭软件的自动更新05-未完待续... 01-测试有无网络 ping www.baidu.com 02-配置最基本的嵌入式开发环境(安装tftp-nfs等) 需要安装 tftp,nfs,vim …...
怎么才能让图片不能转发截图保存
发私密图片给好友又担心被截图保存甚至转发给第三人?有没有办法让发出去的图片不能转发、截图、保存?当然有!今天教你一招,并且对方打开不需要下载任何软件,发出去对方点开就能看。 操作步骤 如何发送这样限制截图的图…...
设计模式-装饰器模式(结构型)与责任链模式(行为型)对比,以及链式设计
提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言1.装饰器模式1.1概念1.2作用1.3应用场景1.4特点1.5类与对象关系1.6实现 2责任链模式2.1概念2.2作用2.3应用场景2.4特点2.5类与对象关系2.6实现 3.对比总结 前言…...
outlook软件配置邮箱提示“到邮件服务器的加密连接不可用”
outlook软件配置邮箱提示“到邮件服务器的加密连接不可用” 问题描述: outlook软件里邮箱提示“已断开”或配置邮箱时提示“到邮件服务器的加密连接不可用”。 解决方案: 一、更改注册表(可先导出备份) winr,输入re…...
通过QT实现进度条随着读取文件增加
mythread循环给主线程发送信号实现主线程循环的功能 widget.h #ifndef WIDGET_H #define WIDGET_H#include <QWidget> #include <QFile> #include <QFileDialog> #include <QTextStream> #include <QByteArray> #include "mythread.h"…...
构建高效可靠的分布式推理系统:深入解析控制器与模型服务的协同工作
在现代互联网应用中,随着用户需求的增长和技术的进步,单一服务器已经难以满足大规模并发请求的需求。为了提升系统的性能和可靠性,开发者们越来越多地采用分布式架构。本文将结合具体的代码示例,深入浅出地探讨如何构建一个高效的分布式推理系统,并详细解析其中的关键组件…...
洛谷B2082
数字统计 - 洛谷 数字统计 题目描述 请统计某个给定范围 [L,R] 的所有整数中,数字 2 出现的次数。 比如给定范围 [2,22],数字2 在数 2 中出现了 1 次,在数 12 中出现 1 次,在数 20中出现 1次,在数 21 中出现 1 次&…...
HTML5系列(14)-- 链接与资源关系指南
前端技术探索系列:HTML5 链接与资源关系指南 🔗 致读者:探索资源加载的艺术 👋 前端开发者们, 今天我们将深入探讨 HTML5 的链接与资源关系管理,学习如何优化网站的资源加载策略,提升用户体验…...
ubuntu系统每天凌晨定时上传redis 备份数据到阿里云OSS上
1.压缩备份脚本 1.1 代码如下#!/bin/bash# redis_backup_compress.sh # 设置变量 BACKUP_DIR"/data/redis/backup" REDIS_DIR"/var/lib/redis" DATE$(date %Y%m%d_%H%M%S) BACKUP_FILE"redis_backup_${DATE}.rdb" COMPRESSED_FILE"redis_b…...
uniapp结合movable-area与movable-view实现拖拽功能
前言 因为公司业务开发需要拖拽功能。 ps:该功能只能针对高度一致的,如果高度不一致需要另外二开 演示 开始 <template><view style"height: 100%;"><movable-area :style"{width: 100%, height: allHeight px}"…...
JavaScript 单例模式的创建与应用
JavaScript 单例模式的创建与应用 单例模式(Singleton Pattern)是一种设计模式,旨在确保一个类只有一个实例,并提供全局访问点。在 JavaScript 中,单例模式可以帮助我们避免多次创建同一个对象,节省资源&a…...
【HarmonyOS】 鸿蒙保存图片或视频到相册
【HarmonyOS】 鸿蒙保存图片或视频到相册 前言 鸿蒙中保存图片或者视频,或者其他媒体文件到设备的媒体库,可以是相册,也可以是文件管理等。共有两种方式: 需要应用申请受限权限,获取文件读写的权限(调用…...
windows下nacos启动报错:java.lang.unsatisfiedLinkError: C:\USers\乱码AppData\xxx.dll
问题 看了许多别的帖子,大家都是因为缺少dll包,下载安装 Microsoft Visual C 2015 Redistributable 就可以。但我试过了不行。思来想去,之前正常的时候用的JDK版本是17,后面别的项目用1.8给切换回来了。然后尝试配置环境变量将JD…...
梳理你的思路(从OOP到架构设计)_基本OOP知识01
目录 1、“-Oriented” 的涵意 2、 ” -Oriented”、” -Based”、” -Driven”、” -Centered” 它们之间区别 3、 从对象(Object) 谈起 4、类的用途: 叙述软件对象 Android从程序员到架构师之路:梳理你的思路(从OOP到架构设计) 1、“-Oriented” …...
【C++图论 BFS算法】2467. 树上最大得分和路径|2053
本文涉及知识点 C图论 CBFS算法 LeetCode2467. 树上最大得分和路径 一个 n 个节点的无向树,节点编号为 0 到 n - 1 ,树的根结点是 0 号节点。给你一个长度为 n - 1 的二维整数数组 edges ,其中 edges[i] [ai, bi] ,表示节点 a…...
Java的Mvc整合Swagger的knife4框架
Swagger的介绍 Swagger 是一个规范和完整的框架,用于生成、描述、调用和可视化 RESTful 风格的 Web 服务。使用Swagger,就是把相关的信息存储在它定义的描述文件里面(yml或json格式),再通过维护这个描述 文件可以去更…...
AI项目二十六:YOLOV11简单部署测试
若该文为原创文章,转载请注明原文出处。 一、YOLOv11介绍 继YOLOv 8、YOLOv 9和YOLOv10之后,发布的YOLOV11引入了几个突破性的增强功能,为目标检测和计算机视觉设定了新的基准。 增强的特征提取:YOLOv11使用改进的主干和颈部架构…...
19. Three.js案例-创建一个带有纹理映射的旋转平面
19. Three.js案例-创建一个带有纹理映射的旋转平面 实现效果 知识点 WebGLRenderer (WebGL渲染器) WebGLRenderer 是 Three.js 中用于渲染场景的主要类。它利用 WebGL 技术在浏览器中绘制 3D 图形。 构造器 new THREE.WebGLRenderer(parameters)参数类型描述parametersobj…...
【Makefile】编译日志之输出重定向符号 >
用法1 make all >& compilelog.txt make all > compilelog.txt这两个编译命令在功能上有一些细微的区别,主要在于标准输出和标准错误的处理方式。 make all >& compilelog.txt 这个命令会将标准输出(stdout)和标准错误&a…...
TDengine 新功能 复合主键
1. 简介 从 TDengine 3.3.0.0 版本之后,新增了复合主键的功能。 TDengine 原来的时间列是不允许有重复时间戳的,有了复合主键功能后,时间列即允许有重复,重复后的时间戳按紧跟其后第二列主键列的值来确定唯一性。 此功能的常用…...
【OpenHarmony】初识设备间互联互通的统一基础:分布式软总线
分布式软总线 前言软总线软总线代码目录软总线传输模块概述传输模块主要对外接口和使用方式 前言 很久没有写出一篇能够分享出来的学习心得了,零零散散地写了好多,总是不太满意。今年8月份开始正式投入精力去学习open harmony,记得第一次接触…...
yocto加软件包install 动态链接库报错
加入bb文件,编译通过 在install时报错 报错 ERROR: demo-1.0-r0 do_package_qa: QA Issue: -dev package agent-dev contains non-symlink .so ‘/usr/lib64/libdemo.so’ 解决 在bb文件install前加2行 SOLIBS ".so" FILES_SOLIBSDEV ""do_install …...
《数据结构》(408代码题)
2009 单链表(双指针) 分析:首先呢,给我们的数据结构是一个带有表头结点的单链表,也不允许我们改变链表的结构。链表的长度不是直接给出的啊,所以这个倒数也很棘手。那我们该如何解决这个“k”呢,…...
哈希表的完善及unordered_map/unordered_set封装
1.哈希表的完善 1.1 优化:哈希函数 在实际使用中,往往需要以字符串作为存储依据(键值),比如姓名与快递信息、商品名称与价格、中文单词与英文释义等。 而在上一篇文章中,我们实现的哈希表只考虑了整型的存储情况,即直…...
“物联·数据·产融·场景”聚力垂直数智场景下的新质生产力破局
人工智能、物联网(简称AIOT)正在深刻改变世界的经济格局,对各行各业产生深厚的影响。12月6日,由深圳市物联网协会、华夏银行深圳分行、深圳市区块链技术应用协会、深圳市康复辅助器具智能技术应用协会联合主办的第五届AIOT生态大会…...
API接口的性能测试与优化策略
在现代软件开发中,API(应用程序编程接口)扮演着至关重要的角色,它们作为不同服务之间的桥梁,确保数据的顺畅流通与交互。然而,随着用户需求的不断增长和系统复杂性的提升,API接口的性能问题日益…...
【Vue】Part4 接口调用
接口调用方式 原生ajax基于jQuery的ajaxfetchaxios 异步 JavaScript的执行环境是「单线程」所谓单线程,是指JS引擎中负责解释和执行JavaScript代码的线程只有一个,也就是一次只能完成一项任务,这个任务执行完后才能执行下一个,…...