Flask-socketio 断开客户端连接

Avi*_*rma 5 flask flask-socketio

我正在使用flask-socketio制作一个聊天应用程序,现在我想在客户端断开连接时(即当客户端关闭浏览器/选项卡时)使用客户端的用户名向服务器发送一条消息,以便我可以将该消息从服务器发送到所有现有客户端更改他们的在线好友列表。我已经用谷歌搜索了两个多小时,我所接近的任何东西都是这个这个,但它对我不起作用。我在服务器端通过以下方式在 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.
Run Code Online (Sandbox Code Playgroud)

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

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

我是 Flask-socketio 的新手,任何帮助将不胜感激。

ngS*_*.py 4

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

客户端:

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

服务器端:

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