这个程序使用 Flask 框架创建了一个简单的网页界面,可以通过点击'Start Command'按钮来启动一个 iPerf3 命令,并通过点击'Stop Command'按钮来停止该命令。命令的输出将以文本形式显示在页面上。

最初的代码存在一个问题:命令的输出无法正确显示在页面上。这是因为在/stream路由中的generate()函数中,使用了process.stdout.readline()来读取命令的输出。但是,在/start路由中的stream()函数中,同样的代码被用于读取命令的输出,并通过yield语句发送到前端。这导致了两个函数中的同一个process.stdout对象被同时使用,从而导致命令的输出无法正确传递到前端。

为了解决这个问题,我们将命令的输出保存到一个列表中,并使用一个全局变量来存储这个列表。然后,在/stream路由中,我们可以使用一个循环来遍历这个列表,并将每个输出发送到前端。

以下是修改后的代码:

# app.py

import subprocess
from flask import Flask, render_template, request, jsonify, Response

app = Flask(__name__)
process = None
output_list = []

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

@app.route('/start', methods=['POST'])
def start():
    global process, output_list
    if process:
        return jsonify({'message': 'Command already running.'})

    process = subprocess.Popen(['iperf3', '-s', '-p', '1111'], stdout=subprocess.PIPE, universal_newlines=True)

    def stream():
        while process and process.poll() is None:
            output = process.stdout.readline().strip()
            output_list.append(output)
            yield output + '
'

    return Response(stream(), mimetype='text/plain')

@app.route('/stream')
def stream():
    global output_list
    if output_list:
        def generate():
            while output_list:
                output = output_list.pop(0)
                yield output + '
'
        return Response(generate(), mimetype='text/event-stream')
    else:
        return jsonify({'message': 'No command running.'})

@app.route('/stop', methods=['POST'])
def stop():
    global process, output_list
    if process:
        process.terminate()
        process = None
        output_list = []
        return jsonify({'message': 'Command stopped.'})
    else:
        return jsonify({'message': 'No command running.'})

if __name__ == '__main__':
    app.run()

通过这些修改,命令的输出应该能够正确地显示在页面上了。

iPerf3 Web Interface -  实时监控网络带宽性能

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

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