Node.js + Socket.IO で接続中のソケット/クライアントリストを取得する方法
Node.js + Socket.IO で接続中のソケット/クライアントリストを取得する方法
Socket.IO で接続中の全てのソケット/クライアントのリストを取得するには、以下の2つの方法があります。
io.sockets.sockets プロパティを使用する
最もシンプルでよく使われる方法です。以下のコード例のように、io.sockets.sockets
プロパティにアクセスすることで、接続中の全てのソケットオブジェクトの配列を取得できます。
const io = require('socket.io')(app);
io.on('connection', (socket) => {
console.log('a user connected');
// 以下で接続中の全てのソケットを取得
const connectedSockets = io.sockets.sockets;
console.log(connectedSockets);
});
adapter.rooms プロパティを使用する
より詳細な情報を含むリストを取得したい場合は、adapter.rooms
プロパティを使用する方法もあります。このプロパティは、接続中の全てのルームと、そのルームに属するソケットIDのリストを返します。
const io = require('socket.io')(app);
io.on('connection', (socket) => {
console.log('a user connected');
// 以下で接続中の全てのルームとソケットIDリストを取得
const rooms = io.adapter.rooms;
console.log(rooms);
});
補足
- 上記のコード例は、接続イベントで取得する方法を紹介していますが、他のイベントでも同様に取得できます。
- 取得したソケットオブジェクトには、ID、接続情報、イベントリスナーなど、様々な情報が含まれています。
- 特定のルームに属するソケットのみを取得したい場合は、
adapter.rooms[roomName]
でルーム名を指定してアクセスできます。
上記以外にも、サードパーティ製のライブラリなどを利用して、より柔軟に接続中のソケットを管理する方法もあります。具体的なニーズに合わせて、最適な方法を選択してください。
Node.js + Socket.IO で接続中のソケット/クライアントリストを取得するサンプルコード
以下のコードは、Node.js + Socket.IO で接続中の全てのソケット/クライアントのリストを取得し、コンソールに出力するサンプルコードです。
const io = require('socket.io')(app);
io.on('connection', (socket) => {
console.log('a user connected');
// 以下で接続中の全てのソケットを取得
const connectedSockets = io.sockets.sockets;
console.log(connectedSockets);
// 各ソケットに対して、IDと接続情報をコンソールに出力
connectedSockets.forEach((socket) => {
console.log(socket.id, socket.remoteAddress);
});
});
const io = require('socket.io')(app);
io.on('connection', (socket) => {
console.log('a user connected');
// 以下で接続中の全てのルームとソケットIDリストを取得
const rooms = io.adapter.rooms;
console.log(rooms);
// 各ルームに対して、ルーム名と属するソケットIDリストをコンソールに出力
for (const roomName in rooms) {
console.log(roomName, rooms[roomName]);
}
});
説明
- 上記のコードは、接続イベントで実行されます。
io.sockets.sockets
またはio.adapter.rooms
を使用して、接続中のソケット/クライアントリストを取得します。- 取得したリストは、コンソールに出力されます。
io.sockets.sockets
の場合は、各ソケットのIDと接続情報も出力されます。io.adapter.rooms
の場合は、各ルーム名と属するソケットIDリストも出力されます。
実行方法
- 上記のコードを
app.js
などのファイルに保存します。 - 以下のコマンドを実行して、Node.jsサーバーを起動します。
node app.js
- ブラウザから
http://localhost:3000
(デフォルトポート) にアクセスします。 - コンソールを確認すると、接続中のソケット/クライアントリストが表示されます。
- ポート番号は、
io.listen(port)
で指定できます。 - コードを実行する前に、Socket.IO をインストールする必要があります。
npm install socket.io
Node.js + Socket.IO で接続中のソケット/クライアントリストを取得するその他の方法
上記で紹介した2つの方法以外にも、Node.js + Socket.IO で接続中のソケット/クライアントリストを取得する方法があります。いくつか例を挙げます。
名前空間を使用している場合は、namespace.sockets.sockets
プロパティを使用して、その名前空間に接続中のソケットリストを取得できます。
const io = require('socket.io')(app);
const myNamespace = io.of('/my-namespace');
myNamespace.on('connection', (socket) => {
console.log('a user connected to my-namespace');
// 以下でmy-namespaceに接続中の全てのソケットを取得
const connectedSockets = myNamespace.sockets.sockets;
console.log(connectedSockets);
});
特定のソケットに属するルームリストを取得したい場合は、socket.rooms
プロパティを使用できます。
const io = require('socket.io')(app);
io.on('connection', (socket) => {
console.log('a user connected');
// 以下で接続中の全てのルームを取得
const rooms = socket.rooms;
console.log(rooms);
});
socket.on('disconnect') イベントを使用する
接続が切断されたソケットをリストから削除したい場合は、socket.on('disconnect')
イベントを使用できます。
const io = require('socket.io')(app);
io.on('connection', (socket) => {
console.log('a user connected');
// 以下で接続中のソケットリストを初期化
const connectedSockets = [];
// 接続イベントでリストに追加
socket.on('connect', () => {
connectedSockets.push(socket.id);
console.log('socket connected:', socket.id);
});
// 切断イベントでリストから削除
socket.on('disconnect', () => {
const index = connectedSockets.indexOf(socket.id);
if (index !== -1) {
connectedSockets.splice(index, 1);
console.log('socket disconnected:', socket.id);
}
});
});
サードパーティ製のライブラリを使用する
より柔軟な機能が必要な場合は、サードパーティ製のライブラリを使用する方法もあります。いくつか例を挙げます。
上記の方法は、それぞれ異なる状況で役立ちます。具体的なニーズに合わせて、最適な方法を選択してください。
node.js socket.io