实现单聊

socketio 中并没有提供单聊的事件,因此需要自定义,这里定义 personal 事件。首先在服务端实现如下代码。

@socketio.on("personal")
def send_personal(data):
    to_username = data.get('to_user')
    message = data.get('message')

    if not to_username or not UserManager.has_user(to_username):
        return result(ResultCode.ERROR_PARAMS, message="请输入正确的目标用户")

    to_user = UserManager.get_user(to_username)
    emit("personal", {"message": message, "from_user": session.get("username")}, room=[to_user.get("sid")])
python

上述代码中,通过 @socketio.on("personal") 自定义了 personal 事件及 send_personal 处理函数,并且为了能接收客户端传过来的参数,我们还定义了一个 data 参数。在 send_personal 处理函数中,先是获取此消息要发送的目标用户以及消息内容,在条件都满足后,通过 emit 函数发送 personal 事件到 room 参数指定的客户端,并且携带了消息内容以及消息发送者。客户端则通过监听和发送 personal 事件来实现与服务端的交互,客户端监听 personal 事件的代码如下。

// 监听 personal 事件
socket.on("personal", function (data) {
    let message = data.message;
    let from_user = data.from_user;
    console.log("message:" + message + ", from_user:" + from_user);
});
javascript

客户端主动向服务端发送 personal 事件的代码如下。

// 客户端向服务端发送 personal 事件
socket.emit("personal", {"to_user": to_user, "message": message}, function () {
    console.log("消息发送成功");
});
javascript

上述监听和发送 personal 事件代码中,我们实现了回调函数,在 personal 消息被成功接收和发送后,都会执行对应的回调函数。在回调函数中,我们也可以执行一些其他操作,如添加消息体到对话框中。