📜  带有 gevent 的烧瓶 socketio - Python (1)

📅  最后修改于: 2023-12-03 15:39:24.123000             🧑  作者: Mango

带有 gevent 的烧瓶 socketio - Python

介绍

本文将介绍如何使用 gevent 和烧瓶框架来创建一个 socketio 服务器。gevent 是一个基于协程的 Python 网络库,可以极大地提高 Python 网络编程的性能。而烧瓶框架是一个轻量级的 Python web 框架,易于学习和使用。

我们将创建一个简单的聊天应用程序,用户可以通过浏览器连接到服务器,发送和接收消息。

前提条件

在继续之前,请确保已经安装了以下软件:

  • Python 3.x
  • Flask(可以使用 pip install flask 命令进行安装)
  • Flask-SocketIO(可以使用 pip install flask-socketio 命令进行安装)
  • gevent 和 gevent-websocket(可以使用 pip install gevent gevent-websocket 命令进行安装)
创建应用程序

首先,我们需要创建一个 Flask 应用程序。在终端里输入以下命令:

mkdir flask_socketio_app
cd flask_socketio_app
touch app.py

在 app.py 文件中,输入以下代码:

from flask import Flask, render_template
from flask_socketio import SocketIO, emit

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app)

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

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

这是一个最小化的 Flask 应用程序,它只有一个路由 / ,当你访问此路由时,会返回一个 HTML 页面。

现在,我们需要创建一个 HTML 文件作为聊天应用程序的前端界面。

在应用程序目录下,创建一个 templates 文件夹,并在其中创建一个 index.html 文件,输入以下代码:

<!doctype html>
<html>
  <head>
    <title>Flask-SocketIO Chat</title>
  </head>
  <body>

    <script src="//code.jquery.com/jquery-1.12.4.min.js"></script>
    <script src="//cdnjs.cloudflare.com/ajax/libs/socket.io/2.3.0/socket.io.js"></script>

    <script type="text/javascript" charset="utf-8">
        $(document).ready(function() {
            var socket = io.connect('http://' + document.domain + ':' + location.port);

            socket.on('connect', function() {
                socket.emit('joined', {});
            });

            socket.on('status', function(data) {
                $('#messages').append('<p>' + data + '</p>');
            });

            socket.on('message', function(data) {
                $('#messages').append('<p>' + data.msg + '</p>');
            });

            $('#sendbutton').on('click', function(e) {
                socket.emit('text', $('#mytext').val());
                $('#mytext').val('');
            });

            $('#leavebutton').on('click', function(e) {
                socket.emit('left', {});
            });
        });
    </script>

    <div id="messages"></div>

    <input type="text" id="mytext" />
    <button id="sendbutton">Send</button>
    <button id="leavebutton">Leave</button>

  </body>
</html>

此前端代码中的 JavaScript 部分负责与后端 socketio 服务器进行通信。它使用 jQuery 实现了与服务器的连接,并定义了一些事件处理程序(如连接到服务器、接收消息、发送消息等)。

编写服务器端代码

现在,让我们进入到服务器端代码的编写。我们需要初始化 socketio 并实现以下事件处理程序:

  • joined:客户端连接到服务器时触发该事件。
  • text:客户端发送消息时触发该事件。
  • left:客户端断开连接时触发该事件。

在 app.py 文件中,添加以下代码来实现这些事件处理程序:

from flask import Flask, render_template
from flask_socketio import SocketIO, emit

app = Flask(__name__)
app.config['SECRET_KEY'] = 'secret!'
socketio = SocketIO(app, async_mode='gevent')

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

@socketio.on('joined')
def joined():
    emit('status', {'msg': 'A new user has joined.'}, broadcast=True)

@socketio.on('text')
def text(message):
    emit('message', {'msg': message}, broadcast=True)

@socketio.on('left')
def left():
    emit('status', {'msg': 'A user has left.'}, broadcast=True)

if __name__ == '__main__':
    socketio.run(app)
运行应用程序

现在,我们已经完成了应用程序的编写。在终端里输入以下命令来启动应用程序:

python3 app.py

在浏览器中访问 http://localhost:5000,您可以看到服务器已经运行,并在等待客户端连接。

打开多个浏览器窗口,连接到服务器并尝试发送和接收消息。

总结

在本篇文章中,我们介绍了如何使用 gevent 和烧瓶框架来创建一个支持 socketio 的聊天应用程序。gevent 异步IO 框架的高性能大幅提升了应用程序的性能,而烧瓶框架的简单易用让开发过程更加愉悦。