Flask-socketio断开客户端连接

时间:2020-06-13 05:30:11

标签: flask flask-socketio

我正在使用flask-socketio创建一个聊天应用程序,现在我想在客户端断开连接时(即,当客户端关闭浏览器/选项卡时)使用客户端的用户名向服务器发送消息,以便我可以将该消息从服务器发送到所有现有客户端客户更改他们的在线朋友列表。我在Google上搜索了两个多小时,而我接近的是thisthis,但这对我不起作用。在服务器端,可以通过以下方式在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的新手,任何帮助将不胜感激。

2 个答案:

答案 0 :(得分:1)

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

客户端:

<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.')

答案 1 :(得分:0)

利用 Flask 的“请求”对象。您的服务器代码如下所示:

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 访问他们的显示名称。