首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >socket.io -包括私人和公共信息

socket.io -包括私人和公共信息
EN

Stack Overflow用户
提问于 2016-12-11 01:06:29
回答 2查看 281关注 0票数 0

我有一些问题,我应该如何构造我的应用程序。

可以和50+用户在一个房间里,也可以私下给用户发短信。

我应该在客户端有两个不同的发射器吗?或者我应该只有一个,让服务器根据数据决定它应该是一个私有消息还是公共消息(我想的是一个参数,它是正确的还是错误的)?

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2016-12-11 08:42:14

这实际上只是一个软件设计的选择。没有“对”或“错”的答案。这与决定是为两个相关功能单独命名还是为传递不同参数的函数创建一个函数几乎是同一个问题。

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

代码语言:javascript
运行
复制
// send to a single user
socket.emit("privateMessage", {userID: xxxx, msg: "Hello"});

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

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

而不是使用带有参数的公共消息:

代码语言:javascript
运行
复制
// 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"});
票数 0
EN

Stack Overflow用户

发布于 2018-04-18 23:42:50

为了进一步澄清jfriend00s的答案,您需要将私有消息定向到特定的socket.id。

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

代码语言:javascript
运行
复制
socket.to(<socketid>).emit('message', {type:"private", msg:"Content"});

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

代码语言:javascript
运行
复制
socket.to('FunRoom').emit('message', {type:"public", msg:"Content"});

使用:

代码语言:javascript
运行
复制
socket.emit("message", {type: "private", userID: xxxx, msg: "Hello"});

建议将发送到整个房间,但只使用客户端代码向特定用户显示。私有消息可以从开发人员工具中读取。

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

代码语言:javascript
运行
复制
redis.set('userID', socket.id);

然后,当消息出现时:

代码语言:javascript
运行
复制
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')
}

如果您采用这种方法,请确保清除断开连接时的红线:

代码语言:javascript
运行
复制
socket.on('disconnect', function () {
    redis.del(userID)
    socket.to('FunRoom').emit('userLeft', {userID: userID});
});

尽管为时已晚,但我只想添加这一点,因为jfriend00建议的方法似乎建议将私有消息过滤到客户端。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/41082000

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档