zoukankan      html  css  js  c++  java
  • Flask 之SocketIO库的使用(绘图)

    WebScoket 通信技术作用是让客户端和服务器之间能进行双向实时通信,它是HTML最新标准H5的协议规范,本质上是个基于TCP的协议,它通过HTTP/HTTPS协议发送一条特殊的请求进行握手后创建了一个TCP连接,此后浏览器/客户端和服务器之间便可以通过此连接来进行双向实时通信,通过使用WebSocket通信技术,可以实现实时数据同步,在动态图表绘制方面贡献巨大.

    Flask 默认提供了针对WebSocket的支持插件from flask_socketio import SocketIO 直接通过pip命令安装即可导入使用,前端也需要引入socketIO库文件,其网站首页是:https://socket.io/

    实现简单的数据通信

    新建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"});  // 初始化完成后,发送一条消息.
            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")
    
    # 出现消息后,率先执行此处
    @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数据
                          namespace="/Socket")
    
    # 当websocket连接成功时,自动触发connect默认方法
    @socketio.on("connect",namespace="/Socket")
    def connect():
        print("链接建立成功..")
    
    # 当websocket连接失败时,自动触发disconnect默认方法
    @socketio.on("disconnect",namespace="/Socket")
    def disconnect():
        print("链接建立失败..")
    
    if __name__ == '__main__':
        socketio.run(app,debug=True,host="0.0.0.0")
    

    效果如下,程序会每隔一秒钟同步一次数据,在控制台中可看到。

    使用SocketIO库绘制主机动态图形

    前端第一个脚本,用于接收数据。

       <script type="text/javascript" charset="UTF-8">
            // 负责接收目标主机的CPU负载情况
            $(document).ready(function() {
                namespace = '/Socket';
                var socket = io.connect("http://" + document.domain + ":" + location.port + namespace);
                socket.emit("message",{"data":"hello lyshark"});  // 初始化完成后,发送一条消息.
                socket.on('response', function(recv) {
                    //console.log(recv.Data);
                    update(recv)   // 发送到update函数处理请求
                });
            });
        </script>
    

    第二个脚本负责解析参数

        <script type="text/javascript" charset="UTF-8">
            // 负责对参数的解析
            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)  // 调用绘图函数
                }
            };
        </script>
    

    最后一段代码负责,调用百度绘图库,进行图形的呈现。

        <div id="main" style="height:500px;1200px;border:1px solid #eecc11;padding:10px;"></div>
        <script type="text/javascript" charset="UTF-8">
                var display = function(time,cpu){
                    // 负责初始化绘图画布
                    var myChart = echarts.init(document.getElementById('main'));
                    myChart.setOption({
                title: {
                    text: '监控系统CPU资源'
                },
                tooltip: {},
                xAxis: {
                    data: []
                },
                yAxis: {},
                series: [{
                    name: 'cpu',
                    type: 'line',
                    data: []
                }]
            });
                // 下方就是给指定字段填充数据
                myChart.setOption({
                    xAxis: {
                        data: time
                    },
                    series: [{
                        name: 'cpu', // 根据名字对应到相应的系列
                        data: cpu
                    }]
                });
            };
            // 首次显示加载动画
            myChart.showLoading();
        </script>
    

    后端直接区数据并发送给前台 app.py 需要注意flask 开头写法不再是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")
    
    # 出现消息后,率先执行此处
    @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")
    

    最终统计效果如下所示,当然也可以批量统计存入数据库,需要的时候直接调用绘图。

    百度绘图库(官方地址):https://www.echartsjs.com/zh/index.html

    Ajax实现定时器 另一种实现定时器定时获取数据的方法

    <button type="button" class="btn btn-success" id="btn">定时</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("当前进度:" + data.flag);
                        $("#1111").width(data.flag);
                        if (data.flag == 100){
                            clearInterval(count);
                        }
                    }
                })
                },2000);  // 每两秒执行一次
            });
    </script>
    

    版权声明: 本博客,文章与代码均为学习时整理的笔记,博客中除去明确标注有参考文献的文章,其他文章【均为原创】作品,转载请务必【添加出处】,您添加出处是我创作的动力!

    警告:如果您恶意转载本人文章,则您的整站文章,将会变为我的原创作品,请相互尊重!
  • 相关阅读:
    ios 数据类型转换 UIImage转换为NSData NSData转换为NSString
    iOS UI 12 block传值
    iOS UI 11 单例
    iOS UI 08 uitableview 自定义cell
    iOS UI 07 uitableviewi3
    iOS UI 07 uitableviewi2
    iOS UI 07 uitableview
    iOS UI 05 传值
    iOS UI 04 轨道和动画
    iOS UI 03 事件和手势
  • 原文地址:https://www.cnblogs.com/LyShark/p/12106768.html
Copyright © 2011-2022 走看看