私の状況はこれです:
- ユーザーAは、自分が選択した名前で名前空間を作成します
- ユーザーBが作成された名前空間に参加します
- ユーザーAは、サーバーによってブロードキャストされ、ユーザーBによって受信されたメッセージを送信します。
- ユーザーBは、サーバーによってブロードキャストされ、ユーザーAによって受信されたメッセージを送信します。
- ユーザーBは、クライアント側のsocket.disconnect()を介して名前空間を離れます。
- ユーザーBが名前空間に再参加します
- ユーザーBは、サーバーによってブロードキャストされ、ユーザーAによって受信されたメッセージを送信します。
- ユーザーAは、サーバーによってブロードキャストされ、ユーザーBによって受信されないメッセージを送信します
重要な注意事項:
- ユーザーBがページを更新し、ユーザーAがそこにいる間にその名前空間に再び参加すると、ユーザーBは通常どおりメッセージを送受信できます。
- ユーザー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にある可能性があります。