【问题标题】:Can't send message to only one specific room through node.js and socket.io无法通过 node.js 和 socket.io 仅向一个特定房间发送消息
【发布时间】:2015-02-10 05:17:08
【问题描述】:

我有一个我似乎无法解决的问题。我正在与远程系统进行某种集成,并且我的代码在 iframe 中,但我希望这对我来说并不重要:)。

我正在尝试从服务器向特定房间/客户端发送消息以开始会话。我做的第一件事是当用户登录时,我从客户端发出带有用户名的消息。

CLIENT.JS
conn.on('connect', function () {
   conn.emit('session', { username: 'some_username' });
}, false);

在服务器端,我收到消息并将套接字加入房间。

SERVER.JS
socket.on('session', function(session) {
   socket.join(session.username);
});

我有另一个模块通过 redis 与这个 server.js 脚本通信。所以我在 server.js 中还有两个事件

SERVER.JS
var userCreate = redis.createClient();
userCreate.subscribe("userCreate", "userCreate");

var userDestroy = redis.createClient();
userDestroy.subscribe("userDestroy", "userDestroy");

userCreate.on("message", function(channel, data) {
   socket.to(JSON.parse(data).username).emit('beginSession', data);
});

userDestroy.on("message", function(channel, data) {
   socket.to(JSON.parse(data).username).emit('endSession', data);
   socket.leave(JSON.parse(data).username);
});

但是,当我尝试从服务器向客户端发送消息时,我会向所有人广播消息。我做错了什么?

【问题讨论】:

    标签: javascript node.js sockets socket.io client-server


    【解决方案1】:

    嗯,从语法的角度来看,你做的一切都是正确的。

    你不是忘了在endSession 中指定userId 属性吗?

    userDestroy.on("message", function(channel, data) {
       socket.to(JSON.parse(data).userId).emit('endSession', data);
       socket.leave(JSON.parse(data).userId);
    });
    

    如果这不起作用 - 您应该提供 data 对象的内容

    【讨论】:

    • 用户ID是用户名吗?
    • 我只是从beginSession 事件中假设它。但你可能是对的。这取决于从客户端发送的数据
    • 这只是脚本中的一个错字,一切正常。从客户端发送的 ID 是用户名。没有错误。
    猜你喜欢
    • 1970-01-01
    • 2023-03-27
    • 1970-01-01
    • 2015-08-06
    • 1970-01-01
    • 2019-03-12
    • 2017-09-27
    • 2013-08-20
    • 2012-05-24
    相关资源
    最近更新 更多