網(wǎng)站首頁(yè) 編程語(yǔ)言 正文
Flask 默認(rèn)提供了針對(duì)WebSocket的支持插件from flask_socketio import SocketIO 直接通過(guò)pip命令安裝即可導(dǎo)入使用,前端也需要引入socketIO庫(kù)文件,其網(wǎng)站首頁(yè)是:socket.io/
實(shí)現(xiàn)簡(jiǎn)單的數(shù)據(jù)通信
新建index.html
<!--name:index.html-->
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<script type="text/javascript" src="https://code.jquery.com/jquery-3.4.1.slim.min.js"></script>
<script type="text/javascript" src="http://cdn.bootcss.com/socket.io/1.7.0/socket.io.min.js"></script>
</head>
<body>
<script type="text/javascript" charset="UTF-8">
$(document).ready(function() {
namespace = '/Socket';
var socket = io.connect("http://" + document.domain + ":" + location.port + namespace);
socket.emit("message",{"data":"hello lyshark"}); // 初始化完成后,發(fā)送一條消息.
socket.on('response', function(recv) {
console.log(recv.Data)
});
});
</script>
</body>
</html>
app.py
# name: app.py
from flask import Flask,render_template,request
from flask_socketio import SocketIO
async_mode = None
app = Flask(__name__)
app.config['SECRET_KEY'] = "lyshark"
socketio = SocketIO(app)
@app.route("/")
def index():
return render_template("index.html")
# 出現(xiàn)消息后,率先執(zhí)行此處
@socketio.on("message",namespace="/Socket")
def socket(message):
print("接收到消息:",message['data'])
for i in range(1,100):
socketio.sleep(1)
socketio.emit("response", # 綁定通信
{"Data":i}, # 返回socket數(shù)據(jù)
namespace="/Socket")
# 當(dāng)websocket連接成功時(shí),自動(dòng)觸發(fā)connect默認(rèn)方法
@socketio.on("connect",namespace="/Socket")
def connect():
print("鏈接建立成功..")
# 當(dāng)websocket連接失敗時(shí),自動(dòng)觸發(fā)disconnect默認(rèn)方法
@socketio.on("disconnect",namespace="/Socket")
def disconnect():
print("鏈接建立失敗..")
if __name__ == '__main__':
socketio.run(app,debug=True,host="0.0.0.0")
效果如下,程序會(huì)每隔一秒鐘同步一次數(shù)據(jù),在控制臺(tái)中可看到。
使用SocketIO庫(kù)繪制主機(jī)動(dòng)態(tài)圖形
前端第一個(gè)腳本,用于接收數(shù)據(jù)。
<script type="text/javascript" charset="UTF-8">
// 負(fù)責(zé)接收目標(biāo)主機(jī)的CPU負(fù)載情況
$(document).ready(function() {
namespace = '/Socket';
var socket = io.connect("http://" + document.domain + ":" + location.port + namespace);
socket.emit("message",{"data":"hello lyshark"}); // 初始化完成后,發(fā)送一條消息.
socket.on('response', function(recv) {
//console.log(recv.Data);
update(recv) // 發(fā)送到update函數(shù)處理請(qǐng)求
});
});
</script>
第二個(gè)腳本負(fù)責(zé)解析參數(shù)
<script type="text/javascript" charset="UTF-8">
// 負(fù)責(zé)對(duì)參數(shù)的解析
var time =["","","","","","","","","",""];
var cpu = [0,0,0,0,0,0,0,0,0,0];
var update = function(recv){
time.push(recv.Data[0]);
cpu.push(parseFloat(recv.Data[1]));
if(time.length >=10){
time.shift();
cpu.shift();
console.log(time)
display(time,cpu) // 調(diào)用繪圖函數(shù)
}
};
</script>
最后一段代碼負(fù)責(zé),調(diào)用百度繪圖庫(kù),進(jìn)行圖形的呈現(xiàn)。
<div id="main" style="height:500px;width:1200px;border:1px solid #eecc11;padding:10px;"></div>
<script type="text/javascript" charset="UTF-8">
var display = function(time,cpu){
// 負(fù)責(zé)初始化繪圖畫(huà)布
var myChart = echarts.init(document.getElementById('main'));
myChart.setOption({
title: {
text: '監(jiān)控系統(tǒng)CPU資源'
},
tooltip: {},
xAxis: {
data: []
},
yAxis: {},
series: [{
name: 'cpu',
type: 'line',
data: []
}]
});
// 下方就是給指定字段填充數(shù)據(jù)
myChart.setOption({
xAxis: {
data: time
},
series: [{
name: 'cpu', // 根據(jù)名字對(duì)應(yīng)到相應(yīng)的系列
data: cpu
}]
});
};
// 首次顯示加載動(dòng)畫(huà)
myChart.showLoading();
</script>
后端直接區(qū)數(shù)據(jù)并發(fā)送給前臺(tái) app.py 需要注意flask 開(kāi)頭寫(xiě)法不再是app()而要改成 socketio.run(app,debug=True,host="0.0.0.0")才可以
# name: app.py
from flask import Flask,render_template,request
from flask_socketio import SocketIO
import time,psutil
async_mode = None
app = Flask(__name__)
app.config['SECRET_KEY'] = "lyshark"
socketio = SocketIO(app)
@app.route("/")
def index():
return render_template("index.html")
# 出現(xiàn)消息后,率先執(zhí)行此處
@socketio.on("message",namespace="/Socket")
def socket(message):
print("接收到消息:",message['data'])
while True:
socketio.sleep(60)
data = time.strftime("%M:%S",time.localtime())
cpu = psutil.cpu_percent(interval=None,percpu=True)
socketio.emit("response",
{"Data":[data,cpu]},
namespace="/Socket")
if __name__ == '__main__':
socketio.run(app,debug=True,host="0.0.0.0")
最終統(tǒng)計(jì)效果如下所示,當(dāng)然也可以批量統(tǒng)計(jì)存入數(shù)據(jù)庫(kù),需要的時(shí)候直接調(diào)用繪圖。
百度繪圖庫(kù)(官方地址):https://echartsjs.com/
Ajax實(shí)現(xiàn)定時(shí)器 另一種實(shí)現(xiàn)定時(shí)器定時(shí)獲取數(shù)據(jù)的方法
<button type="button" class="btn btn-success" id="btn">定時(shí)</button>
<script>
$("#btn").click(function(){
var count = setInterval(function(){
$.ajax({
url:"/_get/",
type:"POST",
contentType:"application/json;charset=utf-8",
success:function (data) {
var data = JSON.parse(data);
console.log("當(dāng)前進(jìn)度:" + data.flag);
$("#1111").width(data.flag);
if (data.flag == 100){
clearInterval(count);
}
}
})
},2000); // 每?jī)擅雸?zhí)行一次
});
</script>
原文鏈接:https://juejin.cn/post/7179546854361661495
相關(guān)推薦
- 2023-06-13 C語(yǔ)言中求余運(yùn)算符的使用解讀_C 語(yǔ)言
- 2022-07-09 Python二分查找+字符串模板+textwrap模塊,_python
- 2023-01-12 Golang遠(yuǎn)程調(diào)用框架RPC的具體使用_Golang
- 2022-07-19 git代碼沖突解決
- 2022-07-10 Spring依賴(lài)注入的幾種方式詳解
- 2023-04-06 C語(yǔ)言中的多行輸入問(wèn)題及說(shuō)明_C 語(yǔ)言
- 2022-05-25 詳解C++類(lèi)的成員函數(shù)做友元產(chǎn)生的循環(huán)依賴(lài)問(wèn)題_C 語(yǔ)言
- 2022-11-04 react-router-dom?v6?使用詳細(xì)示例_React
- 最近更新
-
- window11 系統(tǒng)安裝 yarn
- 超詳細(xì)win安裝深度學(xué)習(xí)環(huán)境2025年最新版(
- Linux 中運(yùn)行的top命令 怎么退出?
- MySQL 中decimal 的用法? 存儲(chǔ)小
- get 、set 、toString 方法的使
- @Resource和 @Autowired注解
- Java基礎(chǔ)操作-- 運(yùn)算符,流程控制 Flo
- 1. Int 和Integer 的區(qū)別,Jav
- spring @retryable不生效的一種
- Spring Security之認(rèn)證信息的處理
- Spring Security之認(rèn)證過(guò)濾器
- Spring Security概述快速入門(mén)
- Spring Security之配置體系
- 【SpringBoot】SpringCache
- Spring Security之基于方法配置權(quán)
- redisson分布式鎖中waittime的設(shè)
- maven:解決release錯(cuò)誤:Artif
- restTemplate使用總結(jié)
- Spring Security之安全異常處理
- MybatisPlus優(yōu)雅實(shí)現(xiàn)加密?
- Spring ioc容器與Bean的生命周期。
- 【探索SpringCloud】服務(wù)發(fā)現(xiàn)-Nac
- Spring Security之基于HttpR
- Redis 底層數(shù)據(jù)結(jié)構(gòu)-簡(jiǎn)單動(dòng)態(tài)字符串(SD
- arthas操作spring被代理目標(biāo)對(duì)象命令
- Spring中的單例模式應(yīng)用詳解
- 聊聊消息隊(duì)列,發(fā)送消息的4種方式
- bootspring第三方資源配置管理
- GIT同步修改后的遠(yuǎn)程分支