4

さまざまなブラウザーを使用して自分のマシンでテストするチャット スクリプトを設計しています。私はsocket.ioで特定のユーザーにメッセージを送信しようとしているので、ここにあります:

client:

socket.on('msgFromServer', function (data) {
     message = data['message'],
     from = data['from'],
     to = data['to'];               

    if($('#chatbox.'+from).dialog("isOpen") === true){
        $('#chatbox.'+from+' #messageOutput textarea.readOnly').text(message);      
    }   
    else if(($('#chatbox.'+from).dialog("isOpen") !== true)){
        createChatbox(from,to,message);
    }
});




server:

var users = {};
io.sockets.on('connection', function (socket) {
    if( ( users.hasOwnProperty(req.session.name) === false))
            users[req.session.name] = socket;

    socket.on('msgToServer', function (data) {
         for (var u in users){
              console.log("%s | %s",u,users[u]);
         }      

     });
}); 

さて、サーバーに関係するコードの構造についてお話します。「接続」イベントでユーザーを保存する役割を果たします。ページをリロードすると問題が発生します。ブラウザAのユーザーをユーザーオブジェクトに保存し、リロードして再接続すると再度保存しますが、ブラウザBのユーザーオブジェクトの内容を尋ねると...情報時代遅れであり、ユーザーが空の場合に val を格納するために nullity のチェックを試みているにもかかわらず、ブローザー A のオブジェクトの内容を尋ねたときと同じ結果が表示されません --> if( ( users .hasOwnProperty(req.session.name) === false))。基本的に、私が必要としているのは識別子( req.session.name)、すべてのブラウザのすべてのセッションでそのようなコンテナを利用できるようにするため、サーバーがブラウザ A からブラウザ B へのメッセージを受信すると、それを識別してブラウザ B に応答を送信できます。

https://github.com/generalhenry/specificUser/blob/master/app.jshttp://chrissilich.com/blog/socket-io-0-7-sending- _個々のクライアントへのメッセージ/

コードを注意深く見ると... chrissilich.com では、著者は「socket.id」(users[incoming.phonenumber] = socket.id) を保存する必要があると述べていますが、git generalhenry では、そうしなければならないと述べています。 'socket'(users[myName] = socket) リソースを保存します。socket.id の値は両方のブラウザーで同じになる傾向があるため、後者が正しいものです...そしてその値は自動的に変更されます。なぜそこにあるのかわかりません...以前のバージョンのノードではそれがあったと思いますそのように働きました。

4

1 に答える 1

12

問題は、socket.id がユーザーではなくソケットを識別することです。そのため、ユーザーが同時に複数のタブを開いている場合、すべてのタブが異なる socket.id を持つことになります。割り当てると、以前の socketid が上書きされます。

したがって、他の考えられる問題に加えて、少なくともこれを行う必要があります。そうしないと機能しません。すべてのブラウザーで約 1 つのソケットは、毎回 ID を上書きするということです (Socket.IO を使い始めたときに私に起こりました)。

原則として、ユーザーではなく接続を管理することを忘れないでください...ユーザーは複数の接続を持つことができます!.

接続時

function onConnection( socket ) {
    var arr = users[incoming.phonenumber] || null;
    if( !arr ) 
        users[incoming.phonenumber] = arr = [];
    if( arr.indexOf( socket.id ) === -1 )
        arr.push( socket.id ); // Assigns socket id to user
}

切断時

function onDisconnect( socket ) {
    var arr = users[incoming.phonenumber] || null;
    if( !arr ) return; // Should not happen since an user must connect before being disconnected
    var index = arr.indexOf( socket.id );
    if( index !== -1 )
        arr.splice( index, 1 ); // Removes socket id from user
}
于 2013-01-28T11:53:53.473 に答える