iPerf3 Web Interface - 实时监控网络带宽性能
这个程序使用 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()
通过这些修改,命令的输出应该能够正确地显示在页面上了。
原文地址: https://www.cveoy.top/t/topic/qx7G 著作权归作者所有。请勿转载和采集!