2012-12-11 12 views
6

私はこのようなソケットIOとExpressで追加nodeJSアプリケーションを持っている:htmlページをリフレッシュするたびにsocket ioユーザー接続が追加されましたか?

サーバー:

var storeEachSocket=[]; 
var io = require('socket.io').listen(80); 
io.sockets.on('connection', function (socket) { 
    storeEachSocket.push(socket); 
    console.log(storeEachSocket.length); 
    var clients = io.sockets.clients(); //clients is an array 
    console.log(clients.length); 
}); 

クライアント:

<script src="/socket.io/socket.io.js"></script> 
<script> 
var socket = io.connect('http://localhost'); 
</script> 

現在、サーバーが提供する唯一の1つのHTMLページがあります。 ソケット接続がhtmlとserverの間に構築された後(この時点ではstoreEachSocket.lengthは1、clients.lengthは1)、このhtmlページをリフレッシュすると、storeEachSocket.lengthとclients.lengthの両方が2、このhtmlとサーバーとの間に2つのソケット接続があることを示しています。私は知りたいのはこの通常ですか? 2番目のソケット接続を作成しても、最初のソケット接続は終了しませんでしたか?

また、このユーザー(html)を追跡しようとすると、1人のユーザーが2つのソケット接続を使用している場合はどうすればよいでしょうか。

答えて

9

ページを更新しても新しい接続は追加されませんが、現在の接続は基本的に削除され、別の新しい接続が作成されます。私はイベントを切断し、切断されている配列内のソケットを削除するリスナーを追加する必要がありますと思う。私は私のマシンでそれをテストしたので、io.sockets.clients()がリフレッシュ後に2を返すとは思わない。

ユーザーを追跡する場合は、ユーザーIDを取得し、それをキーと値のペアのコレクションに格納する必要があります。次に、認証ハンドラ内のコレクションをチェックすることによって、2つの接続を作成するようにユーザーを制限できます。

var storeEachSocket = {}; 
    io.set('authorization', function(handshake, accept){ 
     var user = handshake.query; 
     if(user.id in storeEachSocket) 
     accept('User already connected', false); 
     else 
     accept(null, true); 
    }); 

    io.on('connection', function(socket){ 
     var user = socket.handshake.query; 
     storeEachSocket[user.id] = socket; 
    }); 

    io.on('disconnect', function(socket){ 
     var user = socket.handshake.query; 
     delete storeEachSocket[user.id] 
    }); 
+0

よく、ありがとうございます。 – user1893787

+0

socket.handshake.queryにはsocket.handshake.queryが含まれていません – Sever

関連する問題