0

私の状況はこれです:

  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は通常どおりメッセージを送受信できます。
  • ユーザー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

4

1 に答える 1

0

代わりに socket.io ルームを使用したくないですか?

socket.join(部屋名);

io.socket.in(部屋名).emit(.....;

ここに部屋の実例があります: https://github.com/rcpeters/openMap_me/blob/master/app.js

于 2012-10-12T16:59:59.447 に答える