Flask-socketio 断开客户端

Flask-socketio disconnect a client

我正在使用 flask-socketio 创建一个聊天应用程序,现在我想在客户端断开连接时(即客户端关闭时)使用客户端的用户名向服务器发送一条消息 browser/tab 以便我可以从服务器到所有现有客户,以便他们更改他们的在线朋友列表。我用谷歌搜索了两个多小时,我接近的任何东西都是 and this 但它对我不起作用。我在服务器端通过以下方式在 flask-socketio 文档中找到了一种方法,但我不知道哪个客户端断开连接,所以我无法更改在线好友列表。

@socketio.on('disconnect')
def test_disconnect():
    print('Client disconnected')
    emit('client disconnected','a client disconnected but I dont know who',broadcast = True) # i have imported emit 
    # but since i don't know which client disconnected i couldn't emit client name above.

所以,我认为从客户端发送消息会更好,如下所示,但在客户端关闭浏览器后,服务器不会收到该消息:

// handle disconnect
socket.on('disconnect',()=>{
      socket.emit('client disconnected',{'username':localStorage.getItem('username')})
})

我是 flask-socketio 的新手,非常感谢任何帮助。

您可以利用 onbeforeunload 事件。当浏览器选项卡或 window 关闭、尝试离开页面或重新加载页面时,将触发此事件。

客户端:

<script>
    window.onbeforeunload = function () {
        socket.emit('client_disconnecting', {'username':localStorage.getItem('username')});
    }
</script>

服务器端:

@socket.on('client_disconnecting')
def disconnect_details(data):
    print(f'{data['username']} user disconnected.')

使用 Flask 'request' 对象。您的服务器代码看起来像这样:

from flask import Flask, request
...
users = {} # rudimentary dict, but use your preferred user management system
@socketio.on('connect')
def connect():
    users[request.sid] = User()
... # I assume some code would go here for users to set/update their display names
@socketio.on('disconnect')
def disconnect():
    emit(
        'user disconnected', 
        {'user_id': request.sid, 'message': users[request.sid].username+' disconnected'}, 
        broadcast=True
    )

我们的想法是在您的用户连接时将 sid 分配给他们,这样您就可以通过他们的 ID 访问他们的显示名称。