使用 Flask 和 SocketIO 创建一个简单的 Web Ping 工具

本代码演示了如何使用 Flask 和 SocketIO 创建一个简单的 Web Ping 工具,实时显示 Ping 命令的输出结果。

后端代码 (server.py)

import subprocess
from flask import Flask, render_template, request, jsonify, make_response
from flask_socketio import SocketIO, emit

app = Flask(__name__, template_folder='C:\Users\zh\PycharmProjects\webping\')
socketio = SocketIO(app, async_mode='eventlet')  # 添加async_mode参数
process = None

@app.route('/')
def index():
    return render_template('index.html')

@app.route('/execute', methods=['POST'])
def execute():
    global process
    if request.form['action'] == 'start':
        if process is not None and process.poll() is None:
            return jsonify({'output': '进程正在运行,请先停止'})
        process = subprocess.Popen(['ping', '1.1.1.1', '-t'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)
        while True:
            output = process.stdout.readline()
            if output == b'' and process.poll() is not None:
                break
            if output:
                output_text = output.decode('gbk').strip()
                print(output_text)
                emit('ping_output', {'output': output_text})
        return jsonify({'output': '命令已执行'})
    elif request.form['action'] == 'stop':
        if process is not None and process.poll() is None:
            process.terminate()
            process.wait()
            process = None
        return jsonify({'output': '进程已停止'})
    else:
        return make_response(jsonify({'error': '无效的动作'}), 400)

if __name__ == '__main__':
    # socketio.run(app, debug=True)
    socketio.run(app, debug=True,allow_unsafe_werkzeug=True)

前端代码 (index.html)

<!DOCTYPE html>
<html>
<head>
    <title>Web Ping</title>
    <script src='https://cdnjs.cloudflare.com/ajax/libs/socket.io/2.3.0/socket.io.js'></script>
    <script src='https://code.jquery.com/jquery-3.5.1.min.js'></script>
</head>
<body>
    <h1>Web Ping</h1>
    <button id='start-btn' onclick='startPing()'>Start</button>
    <button id='stop-btn' onclick='stopPing()'>Stop</button>
    <div id='output-div'></div>

    <script>
        var socket = io.connect();

        // 监听来自后端的ping_output事件
        socket.on('ping_output', function(data) {
            // 将输出内容追加到output-div中
            $('#output-div').append('<p>' + data.output + '</p>');
        });

        function startPing() {
            // 发送POST请求给后端,执行ping命令
            $.post('/execute', {action: 'start'}, function(response) {
                console.log(response.output);
            });
        }

        function stopPing() {
            // 发送POST请求给后端,停止ping命令
            $.post('/execute', {action: 'stop'}, function(response) {
                console.log(response.output);
            });
        }
    </script>
</body>
</html>

运行程序

  1. 确保已安装 Flask 和 SocketIO 库。
  2. 将上述代码保存为 server.pyindex.html 文件,并放在同一目录下。
  3. 运行 server.py 文件。
  4. 在浏览器中打开 http://localhost:5000
  5. 点击“Start”按钮开始 Ping,点击“Stop”按钮停止 Ping。

注意事项

  • 此代码使用了 eventlet 库作为异步模式,确保已安装 eventlet 库。
  • 代码中使用了 gbk 编码解码 Ping 命令的输出,根据实际情况调整编码。
  • 可以根据需求修改 Ping 的目标地址和参数。

代码功能解析

  • Flask 框架提供 Web 服务器和路由功能。
  • SocketIO 库实现实时通信,将 Ping 命令的输出实时显示到网页上。
  • subprocess 模块用于执行系统命令,这里使用 ping 命令。
  • 前端代码使用 jQuery 发送 POST 请求给后端,并使用 SocketIO 监听来自后端的输出。

总结

本代码示例演示了如何使用 Flask 和 SocketIO 创建一个简单的 Web Ping 工具,实时显示 Ping 命令的输出结果。通过使用 SocketIO,我们可以实现实时数据交互,增强用户体验。

希望本代码示例对您有所帮助!

Python Flask Web Ping 工具 - 使用 SocketIO 实时显示 Ping 结果

原文地址: https://www.cveoy.top/t/topic/qyx2 著作权归作者所有。请勿转载和采集!

免费AI点我,无需注册和登录