2012-10-12 41 views
0

我的情况是这样的:Socket.io广播停止工作,然后再结合命名空间

  1. 用户A
  2. 用户B联接创建命名空间
  3. 他所选择的名称创建命名空间用户A发送由服务器广播并由接收的消息用户B
  4. 用户B发送这是由服务器广播和接收用户A
  5. 用户B通过客户端socket.disconnect叶命名空间()消息;
  6. 用户B重新加入命名空间
  7. 用户B发送这是由服务器广播的和由用户A
  8. 用户A发送消息,该消息由服务器和NOT广播接收到的消息通过用户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); 
    }); 
}); 

更新(星期五二零一二年十月十二日)

经过一些调查研究看来该问题可能与socket.io:

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

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

回答

0

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

socket.join(roomName);

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

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

+0

是的,我敢肯定 –

+0

嗡嗡声,以及您的例子看起来像你试图做的很多,这:“socket.namespace.connected_users [data.id] = data;”看起来不对,我会简化你的代码,在这里命名空间的例子:http:// socket。 io /#如何使用 –

+0

呃,谢谢你的试用,如果我没有解决问题,我会在几天内给你一个赏金 –