如果用户离开命名空间然后重新加入,Socket.io广播将停止工作

时间:2012-10-12 15:43:12

标签: javascript node.js socket.io

我的情况是这样的:

  1. 用户A 创建名称为其选择的命名空间
  2. 用户B 加入已创建的命名空间
  3. 用户A 发送由服务器广播并由用户B
  4. 接收的消息
  5. 用户B 发送由服务器广播并由用户A
  6. 接收的消息
  7. 用户B 通过客户端socket.disconnect();
  8. 离开命名空间
  9. 用户B 重新加入名称空间
  10. 用户B 发送由服务器广播并由用户A
  11. 收到的IS的消息
  12. 用户A 发送由服务器广播但未被用户B
  13. 收到的消息

    重要说明:

    • 如果用户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

1 个答案:

答案 0 :(得分:0)

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

socket.join(ROOMNAME);

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

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