Node.js + Socket.IO で接続中のソケット/クライアントリストを取得する方法

2024-05-09

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リストも出力されます。

実行方法

  1. 上記のコードを app.js などのファイルに保存します。
  2. 以下のコマンドを実行して、Node.jsサーバーを起動します。
node app.js
  1. ブラウザから http://localhost:3000 (デフォルトポート) にアクセスします。
  2. コンソールを確認すると、接続中のソケット/クライアントリストが表示されます。
  • ポート番号は、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


【保存版】Node.jsのログ出力:ロギングモジュール、環境変数、リダイレクトを使いこなす

ログの確認方法ログを確認するには、いくつかの方法があります。コンソール: アプリケーションを実行すると、ログメッセージがコンソールに表示されます。ファイルへのリダイレクト: > 演算子を使用して、ログメッセージをファイルにリダイレクトできます。例えば、次のコマンドを実行すると、output...


Bowerインストールの救世主!「bower command not found」エラーを完全解決する方法とは?

「bower command not found」エラーは、Node. jsパッケージマネージャーである「npm」を使用してフロントエンド開発ツール「Bower」をインストールした後に発生することがあります。これは、Bowerがグローバルにインストールされていないか、環境変数「PATH」にBowerのパスが設定されていないことを意味します。...


【超解説】Node.jsでZIP圧縮!archiver、zlib、JSZip、Streams徹底比較。最適な方法はコレだ!

archiverモジュールを使うarchiverは、Node. js用の圧縮ライブラリです。ディレクトリやファイルの圧縮、解凍など様々な機能を提供します。手順:archiverモジュールをインストールします。以下のコードのように、圧縮したいディレクトリと出力ファイルパスを指定してarchiverモジュールを使います。...


Node.js × Express × Nodemon でつくる! 簡単 Web アプリケーション開発入門

Nodemon を使用して Node. js アプリケーションを実行しようとすると、以下のエラーメッセージが表示されます。原因:このエラーは、Nodemon がインストールされていないか、PATH 環境変数に含まれていないことを示します。解決策:...


Vue.js、Node.js、Yarnで発生する「error /node_modules/node-sass: Command failed」エラーの解決策

このエラーは、Node. js、Vue. js、Yarn を使用したプロジェクトで Sass をコンパイルしようとしたときに発生します。Sass は CSS プリプロセッサであり、より記述的で効率的な CSS コードを書くことができます。エラーの原因...