【问题标题】:Flask-socketio disconnect a clientFlask-socketio 断开客户端
【发布时间】:2020-06-13 05:30:11
【问题描述】:

我正在使用flask-socketio制作一个聊天应用程序,现在我想在客户端断开连接时使用客户端的用户名向服务器发出一条消息,即当客户端关闭浏览器/选项卡时,我可以将该消息从服务器发送到所有现有的客户为他们更改他们的在线朋友列表。我已经用谷歌搜索了两个多小时,我接近的任何东西都是thisthis,但它对我不起作用。我在服务器端通过以下方式在flask-socketio docs中找到了一种方法,但我不知道哪个客户端断开连接,所以我无法更改在线好友列表。

@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 的新手,我们将不胜感激。

【问题讨论】:

  • 您可以使用request.sid 知道哪个用户已断开连接。
  • 是的,我可以通过它看到 id,但我也想获取断开连接的客户端的用户名,就像客户端在断开连接后发送一样。

标签: flask flask-socketio


【解决方案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.')

【讨论】:

    【解决方案2】:

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

    【讨论】:

      猜你喜欢
      • 2018-06-18
      • 2019-05-30
      • 1970-01-01
      • 1970-01-01
      • 2022-01-22
      • 2020-07-07
      • 2020-02-13
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多