7

次のように、ソケット io と Express を追加した nodeJS アプリケーションがあります。

サーバ:

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>

現在、サーバーが提供する html ページは 1 つだけです。html とサーバーの間にソケット接続が確立された後 (この時点で storeEachSocket.length は 1 で client.length は 1 です)、この html ページを更新すると、storeEachSocket.length と client.length の両方が 2 になることがわかりました。 、この html とサーバーの間に 2 つのソケット接続があることを示します。これは正常なのか知りたいですか? 2 番目のソケット接続を作成した後でも、最初のソケット接続は消滅しませんか?

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

4

1 に答える 1

10

ページを更新しても新しい接続は追加されません。基本的に現在の接続が削除され、別の新しい接続が作成されます。イベントを切断するリスナーを追加し、切断されたアレイのソケットを削除する必要があると思います。また、マシンでテストしたため、更新後に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]
    });
于 2012-12-12T14:52:35.320 に答える