web-dev-qa-db-ja.com

Socket.io接続ユーザー数

最終的にsocket.ioが正常に動作するようになりましたが、奇妙な問題に遭遇しました。

これが最善の方法かどうかはわかりませんが、私は使用しています:

io.sockets.clients().length

これは、サーバーに接続されているクライアントの数を返します。問題は、ユーザーの接続と切断を数回行った後、数が本来よりも多くなり続けることです。

例えば、私が接続して友人に尋ねると、正しい数字が上がります。しかし、切断と再接続を開始しても、数は減りません。

Vmware ubuntuサーバーでnode.jsおよびsockets.ioサーバーを実行しています。

誰がこれがサーバーに接続されている人の数を見つけるための理由であるか、またはより良い方法を知っていますか?

41
imperium2335

これには github issue があります。問題は、誰かがsocket.ioを切断するたびに配列から削除(splice)せず、値を単に「null」に設定するだけであるため、実際には配列内に多くのnull値があり、クライアントが)。実際の接続よりも長い。

クライアントをカウントする別の方法を管理する必要があります。何かのようなもの

socket.on('connect', function() { connectCounter++; });
socket.on('disconnect', function() { connectCounter--; });

Socket.ioの背後にいる人々がそのようなものを残した理由は心に響きますが、リンクとして投稿したgithubの問題でよりよく説明しています!

39
drinchev

Socket.ioバージョン1.0を使用中に誰かがこのページにアクセスした場合に備えて

接続されたクライアントのカウントは

socketIO.engine.clientsCount

回答が必要で、上記はsocket.ioの新しいバージョンでは機能しませんでした

58
Ahmad

バージョン1.3.7でそれを理解する方法を見つけました。次の3つの方法があります。

  1. _io.engine.clientsCount_
  2. _io.sockets.sockets.length_
  3. Object.keys(io.sockets.connected).length

これらが同じ問題を抱えている人を助けることを願っています。:)

27
Lordran

常に配列をフィルター処理できるのに(暗黙のグローバル)変数を使用するのは、clients()メソッドを呼び出して返されるからです。

function filterNullValues (i) {
  return (i!=null);
}
io.sockets.clients().filter(filterNullValues).length;
5
line-o

現在Socket.io v1.3.6を使用していますが、これが機能することがわかりました。ユーザーが接続したときと切断したときの正確な数を示します。

io.sockets.sockets.length

そのようです:

var io = require('socket.io').listen(server);
io.on('connection', function(socket) {
  console.log(io.sockets.sockets.length);
  socket.on('disconnect', function() {
    console.log(io.sockets.sockets.length);
  });
});
4
devtanc

Socket.io 0.9.10と次のコードを使用して、ソケットの数を決定しています。

var socketIO =  require('socket.io').listen( .....
var numberOfSockets = Object.keys(socketIO.connected).length;

この数がさまざまなEdge-caseにどの程度正確に反応するかはわかりませんが、今では正確に見えます。接続しているブラウザごとに数値が増加し、閉じているブラウザごとに減少します。

3
dknaus

以下もご覧ください。

io.sockets.manager.connected

キーと値のペアのクリーンなリスト(ソケットIDと接続状態?)

3
Gilbert Flamino

socket.io 2.2.0を使用すると簡単です。

io.on('connection', function (socket) {
    console.log( socket.client.conn.server.clientsCount + " users connected" );
});

乾杯

2
rafa226

現在TypeScriptでソケットv1.4.29を使用していますが、これを使用して接続されているクライアントの数を確認できます

 io.sockets.on('connection', function(socket) {
 var clients = socket.client.conn.emit.length;
 console.log("clients: " + clients);
 });
1
parinita

接続ユーザーは、socket.ioバージョン-1.3.7でカウントされます

io.on('connection', (socket) => {
    console.log(io.sockets.server.httpServer._connections);  //output in number
    // or
    console.log(io.sockets.server.engine.clientsCount);  //output in number
});
1
Pavani dasari

私はマルチコアアプリについて何も言及していないので、複数のコア(クラスター)を使用しているので、クライアント側で一貫して適切な数のソケットを取得できなかったので追加します。それらを私のmongoインスタンスに保存すると、非常に一貫性があり正確です。このアプローチでは、ブラウザを介してソケット接続をスタイルで表示できます:)。

Mongooseスキーマ:

var socketSchema = mongoose.Schema({
        socket : Number
});

使用法:

//reset to 0 when the app starts ( just in case )
SocketModel.find({ "socket" : 1 } , function(err, deadSockets ) {
    if (err){
        console.log( err );
    }
    else{
        for( var i = 0 ; i < deadSockets.length ; i++ ){
            deadSockets[i].remove();                
        }
    }
});

io.on('connection', function( socket ) {
    //I found I needed to make sure I had a socket object to get proper counts consistantly
    if( socket ){
        var socketEntry = new SocketModel({ "socket" : 1 });
        socketEntry.save( function(err ){
            if (err){
                console.log( err );
            }
            else{

            }
        });
    }
    //On Disconnect
    socket.on('disconnect', function() {
        SocketModel.findOne({ "socket" : 1} , function(err, deadSocket ) {
            if (err){
                console.log( err );
            }
            else{
                deadSocket.remove();
            }
        }); 
    });
});

いくつ持っていますか?

SocketModel.count({ "socket" : 1 } , function(err, count ) {
    if (err){
        console.log(err);
    }
    else{
        var term = "sockets";
        if( count == 1 ) term = "socket";
        console.log("Current Load: " , count , term );
    }
}); 

注*空のクエリオブジェクト({})を使用するのは好きではないため、代わりにダミーとして{"socket":1}を使用しました

1
Squivo