54

ようやくSocket.IO正常に動作するようになりましたが、奇妙な問題に遭遇しました。

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

io.sockets.clients().length

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

たとえば、接続して友達に頼むと、数字が上がりますが、これは正しいです。しかし、切断して再接続し始めると、数は減少しません。

VMware UbuntuNode.jsサーバーでandSocket.IOサーバーを実行しています。

これはなぜですか、またはサーバーに接続している人数を調べるためのより良い方法はありますか?

4

14 に答える 14

67

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

接続されているクライアント数は、から取得できます。

socketIO.engine.clientsCount

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

于 2014-12-10T18:57:27.203 に答える
51

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

クライアントをカウントするための別の方法を管理する必要があります。

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

なぜsocket.ioの背後にいる人々がそのようなものを残したのかは気になるところですが、リンクとして投稿したgithubの問題で説明する方がよいでしょう!

于 2012-04-23T07:26:52.590 に答える
37

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

  1. io.engine.clientsCount
  2. io.sockets.sockets.length
  3. Object.keys(io.sockets.connected).length

これらが同じ問題を抱えている人に役立つことを願っています.:)

于 2015-10-08T01:59:07.783 に答える
8

client() メソッドを呼び出すことによって返される配列を常にフィルター処理できるのに、(暗黙のグローバル) 変数を使用する理由。

io.sockets.clients().filter(c => !!c).length;

EDIT 短い構文を使用

于 2013-09-17T22:21:34.750 に答える
3

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

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

この数値がさまざまなエッジケースにどの程度正確に反応するかはわかりませんが、今のところ正確なようです。ブラウザーが接続するたびに数値が増加し、ブラウザーを閉じるたびに数値が減少します。

于 2012-09-20T13:50:04.617 に答える
3

以下もご覧ください。

io.sockets.manager.connected

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

于 2012-09-28T23:21:15.307 に答える
1

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

マングース スキーマ :

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 }、代わりにダミーとして使用しました

于 2015-09-30T22:13:47.817 に答える
0

接続されているクライアントの総数を返すには

console.log(io.engine.clientsCount)
于 2022-03-05T18:36:12.797 に答える