实现群聊

在 Flask-SocketIO 中对群聊功能做了非常好的封装,如加入群聊有 join_room 函数、离开群聊有 leave_room 函数。服务端加入群聊和离开群聊的代码如下。

# 加入群聊
@socketio.on("join")
@login_required
def join(data):
    room = data.get("room")
    join_room(room)
    username = session.get("username")
    send(username + "加入群聊", to=room)

# 离开群聊
@socketio.on("leave")
@login_required
def leave(data):
    room = data.get("room")
    leave_room(room)
    username = session.get("username")
    send(username + "离开群聊", to=room)

客户端在某些情况下(如单击加入群聊),通过使用 emit 函数发送 join 事件,即可加入房间,代码如下。

socket.emit("join", {"room": "Flask交流群"});

通过以上代码就加入 “Flask交流群” 房间了。也可以在某些情况下发送 leave 事件,即可离开房间,代码如下。

socket.emit("leave", {"room": "Flask交流群"});

房间名称如果之前不存在,无须执行创建操作,Flask-SocketIO 会自动创建并让此用户加入房间。加入房间后,就可以在房间里聊天了。我们先在服务端实现群聊功能,代码如下。

@socketio.on("room_chat")
@login_required
def room_chat(data):
    room = data.get("room")
    message = data.get("message")
    from_user = UserManager.get_current_user().get("username")
    send({"message": message, "from_user": from_user, "room": room}, to=room)

上述代码中,先从 data 中获取房间名称和消息内容,然后使用 flask_socketio.send 函数将消息内容和消息发送者发送到 to 参数指定的房间中。这样所有加入了此房间的用户都可以收到此消息,客户端监听房间消息的代码如下。

socket.on("room_chat", function (result){
    let from_user = result.from_user;
    let message = result.message;
    let room = result.room;
    console.log("房间号:" + room + " 收到来自 " + from_user + " 的消息:" + message);
});

在其他客户端发送了 room_chat 事件后,就能通过回调函数获取到消息的相关信息了。当然,客户端在某些情况下想要发送房间消息,直接调用 emit 函数即可,代码如下。

socket.emit("room_chat", {"room": "Flask交流群", "message": "大家好"});