最終的にsocket.ioが正常に動作するようになりましたが、奇妙な問題に遭遇しました。
これが最善の方法かどうかはわかりませんが、私は使用しています:
io.sockets.clients().length
これは、サーバーに接続されているクライアントの数を返します。問題は、ユーザーの接続と切断を数回行った後、数が本来よりも多くなり続けることです。
例えば、私が接続して友人に尋ねると、正しい数字が上がります。しかし、切断と再接続を開始しても、数は減りません。
Vmware ubuntuサーバーでnode.jsおよびsockets.ioサーバーを実行しています。
誰がこれがサーバーに接続されている人の数を見つけるための理由であるか、またはより良い方法を知っていますか?
これには github issue があります。問題は、誰かがsocket.ioを切断するたびに配列から削除(splice)せず、値を単に「null」に設定するだけであるため、実際には配列内に多くのnull値があり、クライアントが)。実際の接続よりも長い。
クライアントをカウントする別の方法を管理する必要があります。何かのようなもの
socket.on('connect', function() { connectCounter++; });
socket.on('disconnect', function() { connectCounter--; });
Socket.ioの背後にいる人々がそのようなものを残した理由は心に響きますが、リンクとして投稿したgithubの問題でよりよく説明しています!
Socket.ioバージョン1.0を使用中に誰かがこのページにアクセスした場合に備えて
接続されたクライアントのカウントは
socketIO.engine.clientsCount
回答が必要で、上記はsocket.ioの新しいバージョンでは機能しませんでした
バージョン1.3.7でそれを理解する方法を見つけました。次の3つの方法があります。
io.engine.clientsCount
_io.sockets.sockets.length
_Object.keys(io.sockets.connected).length
これらが同じ問題を抱えている人を助けることを願っています。:)
常に配列をフィルター処理できるのに(暗黙のグローバル)変数を使用するのは、clients()メソッドを呼び出して返されるからです。
function filterNullValues (i) {
return (i!=null);
}
io.sockets.clients().filter(filterNullValues).length;
現在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);
});
});
Socket.io 0.9.10と次のコードを使用して、ソケットの数を決定しています。
var socketIO = require('socket.io').listen( .....
var numberOfSockets = Object.keys(socketIO.connected).length;
この数がさまざまなEdge-caseにどの程度正確に反応するかはわかりませんが、今では正確に見えます。接続しているブラウザごとに数値が増加し、閉じているブラウザごとに減少します。
以下もご覧ください。
io.sockets.manager.connected
キーと値のペアのクリーンなリスト(ソケットIDと接続状態?)
socket.io 2.2.0を使用すると簡単です。
io.on('connection', function (socket) {
console.log( socket.client.conn.server.clientsCount + " users connected" );
});
乾杯
現在TypeScriptでソケットv1.4.29を使用していますが、これを使用して接続されているクライアントの数を確認できます
io.sockets.on('connection', function(socket) {
var clients = socket.client.conn.emit.length;
console.log("clients: " + clients);
});
接続ユーザーは、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
});
私はマルチコアアプリについて何も言及していないので、複数のコア(クラスター)を使用しているので、クライアント側で一貫して適切な数のソケットを取得できなかったので追加します。それらを私の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}を使用しました