3

接続ユーザーのリストを取得するためだけに、非常に単純なスクリプトを作成しました。

var app, io, server;

app = require("express")();
server = require("http").createServer(app);
io = require("socket.io").listen(server);

server.listen(1339);

app.get("/", function(req, res) {
  res.sendfile(__dirname + "/index.html");
});

console.log('INIT', io.sockets.manager.server.connections);

io.sockets.on("connection", function(socket) {
  console.log('CONNECT: ', io.sockets.manager.server.connections);
  socket.on("disconnect", function(data) {
    console.log('DISCONNECT: ', io.sockets.manager.server.connections);
  });
});

そしてHTML:

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>title</title>
</head>
<body>
    <script src="/socket.io/socket.io.js"></script>
    <script>
        var socket = io.connect('http://localhost:1339');
    </script>
</body>
</html>

アプリを実行する0と初期化されますが、ブラウザーでページを開くとすぐに41. また、connections property is deprecated. Use getConnections() method警告が表示されます。v0.10.15 でノードを使用し、v0.9.16 で socket.io を使用しています。

4

1 に答える 1

5

別の場所からクライアントの数を取得する必要があります。

 io.sockets.clients().length

ただし、このアクティブな GitHub の問題を読むと、(ソケットで既に発生していることを超えて) 追加のメモリ リークが発生する可能性があるため、その操作を避けたい場合があります。

完全な動作例を次に示します。

var app = require('express')();
var server = require("http").createServer(app);
var io = require('socket.io').listen(server);

server.listen(1339);

app.get('/', function(req, res) {
    return res.sendfile(__dirname + "/index.html");
});

/*
    to obtain number of connected clients
        io.sockets.clients().length            
 */

console.log("INIT", io.sockets.clients().length );

io.sockets.on("connection", function(socket) {
    console.log("CONNECT:" + io.sockets.clients().length);
    socket.on("disconnect", function(data){
        console.log("DISCONNECT: ", io.sockets.clients().length);
    });
});

切断イベントはクライアントが削除される前に発生するため、カウントはクライアントの総数より 1 つ多くなります (見方によって異なります)。

また、on何らかの理由で値を返すイベント ハンドラーがあったので、それを削除しました。

その関数を使用する代わりに、単純なカウンターだけを使用する方がうまくいく可能性があります。

var clientsConnected = 0;

console.log("INIT", io.sockets.clients().length );

io.sockets.on("connection", function(socket) {
    console.log("CONNECT:" + ++clientsConnected);
    socket.on("disconnect", function(data){
        console.log("DISCONNECT: ", --clientsConnected);
    });
});

切断の数が接続の数を超える可能性があると明らかに報告されているため、カウンターがゼロを下回らないようにする必要がある場合があります。

2 つのクライアントを接続 (その後、1 つを切断):

info: socket.io started
INIT 0
debug: served static content /socket.io.js
debug: client authorized
info: handshake authorized eJcvVsr60fmRzhVpQ6rO
debug: setting request GET /socket.io/1/websocket/eJcvVsr60fmRzhVpQ6rO
debug: set heartbeat interval for client eJcvVsr60fmRzhVpQ6rO
debug: client authorized for 
debug: websocket writing 1::
CONNECT:1
debug: served static content /socket.io.js
debug: client authorized
info: handshake authorized 28lUudTS3KtCphd0Q6rP
debug: setting request GET /socket.io/1/websocket/28lUudTS3KtCphd0Q6rP
debug: set heartbeat interval for client 28lUudTS3KtCphd0Q6rP
debug: client authorized for 
debug: websocket writing 1::
CONNECT:2
info: transport end (socket end)
debug: set close timeout for client 28lUudTS3KtCphd0Q6rP
debug: cleared close timeout for client 28lUudTS3KtCphd0Q6rP
debug: cleared heartbeat interval for client 28lUudTS3KtCphd0Q6rP
DISCONNECT:  2
debug: discarding transport
info: transport end (socket end)
debug: set close timeout for client eJcvVsr60fmRzhVpQ6rO
debug: cleared close timeout for client eJcvVsr60fmRzhVpQ6rO
debug: cleared heartbeat interval for client eJcvVsr60fmRzhVpQ6rO
DISCONNECT:  1
debug: discarding transport
于 2013-08-26T15:49:21.967 に答える