本教程将指导您如何使用 Flask-SocketIO 和 Eventlet 库,通过 WebSocket 连接实时显示 ping 命令的输出结果到网页上。

问题:

您可能会遇到 "The WebSocket transport is not available, you must install a WebSocket server that is compatible with your async mode to enable it." 的错误信息。这意味着您需要安装与您的异步模式兼容的 WebSocket 服务器来启用 WebSocket 传输。

解决方案:

您正在使用 Flask-SocketIO 库,它基于 Flask 和 SocketIO,可以帮助您实现 WebSocket 连接。为了启用 WebSocket 传输,您需要在您的代码中添加异步模式。

步骤:

  1. 安装 Eventlet 库:

    pip install eventlet
    
  2. 修改代码:

    socketio = SocketIO(app) 修改为 socketio = SocketIO(app, async_mode='eventlet'),添加 async_mode 参数来指定使用 Eventlet 作为异步模式。

    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()
                    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)
    

现在,您可以运行您的应用程序并使用 WebSocket 连接来实时显示 ping 命令的输出。

注意:

  • 确保您已经安装了 eventlet 库。
  • 您的 index.html 文件应该包含用于连接 WebSocket 的代码。
  • 您可能需要调整 decode('gbk') 部分,以匹配您的系统编码。

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

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