繁体   English   中英

socket.io-私人消息和公共消息

[英]socket.io - both private and public messages

我在构造应用程序时遇到了麻烦。

可以在一个拥有50个以上用户的房间中,也可以私下向用户发送消息。

在客户端,我应该有两个不同的发射吗? 还是我应该只有一个,然后让服务器根据数据确定它是私人消息还是公共消息(我在想类似具有true或false的参数)?

这实际上只是软件设计的选择。 没有正确或错误的答案。 这与决定是否要为两个相关功能的部分使用不同的名称来创建两个函数,还是确定要向其传递不同的参数的一个函数几乎完全相同。

我个人的看法是,如果对这样的私人消息使用单独的消息名称,则代码会更简单:

// send to a single user
socket.emit("privateMessage", {userID: xxxx, msg: "Hello"});

// broadcast to all users in my room
socket.emit("publicMessage", {msg: "Hello"});

然后,在服务器上,您将有一个单独的公共消息和私有消息处理程序,这可能是一件好事。

而不是使用带有参数的常见消息:

// send to a single user
socket.emit("message", {type: "private", userID: xxxx, msg: "Hello"});

// broadcast to all users in my room
socket.emit("message", {type: "public", msg: "Hello"});

为了进一步阐明jfriend00的答案,您需要将私人消息定向到特定的socket.id。

在服务器端发送给特定用户:

socket.to(<socketid>).emit('message', {type:"private", msg:"Content"});

在服务器端发送到特定房间:

socket.to('FunRoom').emit('message', {type:"public", msg:"Content"});

使用:

socket.emit("message", {type: "private", userID: xxxx, msg: "Hello"});

按照建议,它将发送到整个会议室,但仅使用客户端代码显示给特定用户。 私人消息可以从开发人员工具中读取。

一种简单的方法是使用redis:在套接字连接上,将socket.id保存为用户名。

redis.set('userID', socket.id);

然后当有消息进入时:

socket.on('message', function (message,callback) {
    if(message.type == 'private'){
        redis.get(message.userID, function(err, socketID) {
            if(err){
                return callback(err);//error callback, user may no long be online
            }
            socket.to(socketID).emit('message', message);
            return callback('success')
        });
    }
    socket.to('FunRoom').emit('message', message);
    return callback('success')
}

如果您采用这种方法,请确保在断开连接时清理redis:

socket.on('disconnect', function () {
    redis.del(userID)
    socket.to('FunRoom').emit('userLeft', {userID: userID});
});

尽管已经很晚了,但我只是想添加它,因为jfriend00建议的方法似乎建议将私人消息过滤留给客户端。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM