Socket.IO 接続クライアント取得方法
Socket.IO を使った Node.js アプリケーションで、現在接続しているソケット (クライアント) のリストを取得したい場合、以下の方法が利用できます。
io.engine.clientsCount を使う (バージョンに注意)
Socket.IO のバージョンによっては、io.engine.clientsCount
プロパティを使って、接続しているクライアントの総数を取得できます。 ただし、これはあくまでも 総数 であり、個々のソケットの情報は得られません。 また、Socket.IO v4 以降では非推奨 となっているため、新しいバージョンを使う場合は使えません。
io.of("/").sockets.size を使う
こちらもバージョンによって利用可否が分かれますが、io.of("/").sockets.size
を使うことで、 ルート名前空間 で接続しているソケットの数を取得できます。 こちらもやはり、個々のソケットの情報は得られません。
カスタムの方法で管理する
Socket.IO が提供する直接的なメソッドはないため、自分で接続情報を管理する必要があります。 一般的には、以下のような方法が考えられます。
- Map を利用する: オブジェクトと同様に、Map を使って接続情報を管理します。 オブジェクトに比べて、キーの存在確認や削除が高速になるなどのメリットがあります。
- オブジェクトを利用する: 接続してきたソケットに対して、そのソケットIDをキーとしてオブジェクトに登録します。 切断時には、オブジェクトから削除します。
Node.js の Socket.IO で接続クライアントを取得する方法 - コード例
Socket.IO で接続しているクライアントのリストを取得する方法には、Socket.IO のバージョンによって使えるものと使えないものがあるので、注意が必要です。ここでは、2通りの方法を紹介します。
バージョン
Socket.IO v4 未満
この方法は、io.engine.clientsCount
プロパティを使って、接続しているクライアントの 総数 を取得します。 ただし、 推奨されません ので、新しいバージョンを使う場合は使えません。
const io = require('socket.io')(server);
io.on('connection', (socket) => {
// クライアント接続時の処理
console.log('クライアントが接続しました');
const connectedClients = io.engine.clientsCount;
console.log(`接続中のクライアント数: ${connectedClients}`);
});
カスタムオブジェクトを使った方法
Socket.IO v4 以降では io.engine.clientsCount
が使えないため、自分で接続情報を管理する必要があります。 ここでは、オブジェクトを利用した方法を紹介します。
const io = require('socket.io')(server);
const connectedSockets = {}; // 接続しているソケットを保持するオブジェクト
io.on('connection', (socket) => {
// クライアント接続時の処理
console.log('クライアントが接続しました');
connectedSockets[socket.id] = socket; // ソケットIDをキーにオブジェクトに追加
socket.on('disconnect', () => {
// クライアント切断時の処理
console.log('クライアントが切断しました');
delete connectedSockets[socket.id]; // 切断したソケットをオブジェクトから削除
});
});
Mapを使った方法 (発展的な例)
const io = require('socket.io')(server);
const connectedSockets = new Map(); // 接続しているソケットを保持する Map
io.on('connection', (socket) => {
// クライアント接続時の処理
console.log('クライアントが接続しました');
connectedSockets.set(socket.id, socket); // ソケットIDをキーに Mapに追加
socket.on('disconnect', () => {
// クライアント切断時の処理
console.log('クライアントが切断しました');
connectedSockets.delete(socket.id); // 切断したソケットを Map から削除
});
});
名前空間を利用する
Socket.IO では、名前空間を使って、複数のチャネルのような仮想的な空間を作成できます。 特定の名前空間だけに接続しているクライアントのリストを取得したい場合は、名前空間を利用することができます。
const io = require('socket.io')(server);
const chatNamespace = io.of('/chat'); // "/chat" という名前空間を作成
chatNamespace.on('connection', (socket) => {
// "/chat" 名前空間に接続してきたソケット
console.log('クライアントが /chat 名前空間に接続しました');
const connectedClients = chatNamespace.sockets.size;
console.log(`/chat 名前空間の接続クライアント数: ${connectedClients}`);
});
クライアントから情報を送信させる
接続しているクライアントに対して、定期的に (もしくは接続時) に、クライアントの情報 (名前など) をサーバーに送信させることもできます。 サーバー側では、受け取った情報を元に、接続しているクライアントのリストを管理します。
サードパーティライブラリを使う
Socket.IO の拡張機能を提供するサードパーティライブラリの中には、接続しているクライアント情報を取得しやすくするライブラリもあります。 ライブラリの使い方については、それぞれのライブラリのドキュメントを参照してください。
注意
上記の方法は、それぞれメリット・デメリットがあります。
- サードパーティライブラリ: ライブラリの使い方を覚える必要がある
- クライアントからの送信: クライアント側の処理が必要になる
- 名前空間: 特定のチャネル内でのみ有効
node.js socket.io