【问题标题】:Socket.io broadcast stops working if user leaves namespace then rejoins如果用户离开命名空间然后重新加入,Socket.io 广播将停止工作
【发布时间】:2012-10-03 11:30:11
【问题描述】:

我的情况是这样的:

  1. 用户 A 使用他选择的名称创建命名空间
  2. 用户 B 加入创建的命名空间
  3. 用户A发送消息,由服务器广播并被用户B接收
  4. 用户B发送消息,由服务器广播并被用户A接收
  5. 用户B通过客户端socket.disconnect()离开命名空间;
  6. 用户 B 重新加入命名空间
  7. 用户 B 发送消息,该消息由服务器广播并由 用户 A 接收
  8. 用户 A 发送消息,该消息由服务器广播,用户 B 未收到

重要提示:

  • 如果 用户 B 刷新页面并重新加入该命名空间,而 用户 A 仍然存在,他可以 然后再次正常发送和接收消息。
  • 用户 B 处于“不工作”状态时,他似乎仍在通过套接字发出获取事件。也就是说,只有用户A会收到双方发起的事件,而用户B只会收到自己发起的事件。

为什么,当用户 B 离开并重新加入时,服务器会变成相对于他而言的单向街道?

服务器代码:

var app = require('express')()
  , server = require('http').createServer(app)
  , io = require('socket.io').listen(server);

server.listen(8080);

app.get('/', function (req, res) {
  res.sendfile(__dirname + '/index.html');
});

var connection_function = function(socket) {
    socket.on('join_chat', function(data) {
        socket.set('fb_id', data.id);
        socket.emit('joined_chat', data);
        socket.broadcast.emit('joined_chat', data);
        socket.namespace.connected_users[data.id] = data;
    });
    socket.on('send_message', function(data) {
        data.user = socket.namespace.connected_users[socket.store.data.fb_id];
        socket.emit('recieve_msg', data);
        socket.broadcast.emit('recieve_msg', data);
    });
    socket.on('disconnect', function () {
        socket.broadcast.emit('left_chat', socket.namespace.connected_users[socket.store.data.fb_id]);
        delete socket.namespace.connected_users[socket.store.data.fb_id];
    });

}
var chats = {};

var main = io.of('/main');
main.on('connection', function(socket) {
    socket.on('new_chat', function(data, fn) {
        if(!chats.hasOwnProperty(data.chat_name)) {
            chats[data.chat_name] = io.of('/' + data.chat_name);
            chats[data.chat_name].on('connection', connection_function);
            chats[data.chat_name].connected_users = {};
        }
        fn(data);
    });
});

更新(2012 年 10 月 12 日星期五)

经过更多研究,问题似乎出在 socket.io 上:

https://github.com/LearnBoost/socket.io-client/issues/251

https://github.com/LearnBoost/socket.io-client/issues/473

【问题讨论】:

    标签: javascript node.js socket.io


    【解决方案1】:

    您确定不想改用 socket.io 房间吗?

    socket.join(房间名);

    io.socket.in(roomName).emit(.....;

    我在这里有一个房间的工作示例:https://github.com/rcpeters/openMap_me/blob/master/app.js

    【讨论】:

    • 嗯,您的示例看起来您正在尝试做很多事情。这:“socket.namespace.connected_users[data.id] = data;”在我看来不对。我会按照这里的命名空间示例简化您的代码:socket.io/#how-to-use
    • 嗯,谢谢你的尝试。如果我不解决这个问题,我会在几天后悬赏它。
    • 看来问题出在socket.io上
    猜你喜欢
    • 2018-12-09
    • 2011-09-22
    • 2018-08-08
    • 2020-02-21
    • 2018-06-18
    • 1970-01-01
    • 2012-02-13
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多