我的情况是这样的:
- 用户 A使用他选择的名称创建命名空间
- 用户 B加入创建的命名空间
- 用户 A发送消息,由服务器广播并由用户 B接收
- 用户 B发送消息,由服务器广播并由用户 A接收
- 用户 B通过客户端 socket.disconnect() 离开命名空间;
- 用户 B重新加入命名空间
- 用户 B发送消息,该消息由服务器广播并由用户 A接收
- 用户 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 上: