欢迎访问宙启技术站
智能推送

高效处理Flask-SocketIO客户端断开连接事件的disconnect()方法

发布时间:2023-12-16 06:26:09

Flask-SocketIO 是一个基于 Flask 的扩展库,用于实现 WebSocket 功能。当客户端与服务器建立连接时,可以通过 Flask-SocketIO 提供的 disconnect() 方法监听并处理客户端断开连接事件。下面将介绍如何高效处理该事件,并提供一个使用例子。

在 Flask-SocketIO 中,可以使用 on_disconnect 装饰器来监听客户端断开连接事件。该装饰器需要指定一个回调函数,用于处理客户端断开连接时的逻辑。下面是一个例子:

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

app = Flask(__name__)
socketio = SocketIO(app)

@socketio.on_disconnect()
def on_disconnect():
    print('Client disconnected')
    # 在这里可以添加其他逻辑代码

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

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

在上面的例子中,当客户端断开连接时,会调用 on_disconnect() 方法,然后打印出 "Client disconnected" 的消息。你可以在该方法中添加任何你需要的逻辑代码,例如,可以在客户端断开连接时重新连接、更新在线用户列表等。

为了更好地理解 disconnect() 方法的使用,下面提供一个更详细的例子:

from flask import Flask, render_template, request
from flask_socketio import SocketIO, join_room, leave_room, disconnect

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

# 存储在线用户的字典
online_users = {}

@socketio.on('connect')
def on_connect():
    # 获取客户端发送的用户名
    username = request.args.get('username')
    if username:
        # 将用户名与对应的客户端连接存储到在线用户字典中
        online_users[username] = request.sid
        # 加入一个名为 "chat" 的房间
        join_room('chat')
        # 发送在线用户列表到房间中
        socketio.emit('users', list(online_users.keys()), room='chat')

@socketio.on_disconnect()
def on_disconnect():
    # 遍历在线用户字典,找到与断开连接的客户端关联的用户名,并将其从字典中删除
    for username, sid in online_users.items():
        if sid == request.sid:
            del online_users[username]
            break
    # 更新在线用户列表
    socketio.emit('users', list(online_users.keys()), room='chat')
    # 打印断开连接的客户端的用户名
    print(f'{username} disconnected')

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

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

在上面的例子中,当客户端与服务器建立连接时,会触发 on_connect() 方法。在该方法中,首先获取客户端发送的用户名,然后将用户名与对应的客户端连接存储到 online_users 字典中,并加入一个名为 "chat" 的房间。接下来,会发送在线用户列表到 "chat" 房间中。

当客户端断开连接时,会触发 on_disconnect() 方法。在该方法中,遍历在线用户字典,找到与断开连接的客户端关联的用户名,并将其从字典中删除。然后,更新在线用户列表,并发送到 "chat" 房间中。最后,会打印断开连接的客户端的用户名。

总结来说,Flask-SocketIO 提供了 disconnect() 方法来监听并处理客户端断开连接事件。你可以在该方法中添加自定义的逻辑代码,以便根据你的应用场景来处理客户端断开连接时的行为。