socket.io - 私人和公共消息

时间:2016-12-11 01:06:30

标签: javascript socket.io

我应该如何构建我的应用程序。

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

我应该在客户端有两种不同的发射吗?或者我应该只有一个,让服务器决定它是否应该是基于数据的私人或公共消息(我在想像某个参数有真或假)?

2 个答案:

答案 0 :(得分:0)

这实际上只是一个软件设计选择。没有正确或错误的答案。这与确定是否为两个相关功能部件创建具有单独名称的两个函数或者是否将一个函数传递给不同参数的问题完全相同。

我个人认为,如果您为这样的私人消息使用单独的消息名称,您的代码会更简单:

// 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"});

答案 1 :(得分:0)

进一步澄清jfriend00s的回答你需要将私信直接发送到特定的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建议的方法似乎建议将私人消息过滤到客户端。