クライアントAPI
IO
io
メソッドは、スタンドアロンビルドではグローバルスコープにバインドされています。
<script src="/socket.io/socket.io.js"></script>
<script>
const socket = io();
</script>
バージョン4.3.0以降、ESMバンドルも利用可能です。
<script type="module">
import { io } from "https://cdn.socket.io/4.7.5/socket.io.esm.min.js";
const socket = io();
</script>
インポートマップを使用する場合
<script type="importmap">
{
"imports": {
"socket.io-client": "https://cdn.socket.io/4.7.5/socket.io.esm.min.js"
}
}
</script>
<script type="module">
import { io } from "socket.io-client";
const socket = io();
</script>
それ以外のすべてのケース(一部のビルドツール、Node.js、またはReact Nativeの場合)では、socket.io-client
パッケージからインポートできます。
// ES modules
import { io } from "socket.io-client";
// CommonJS
const { io } = require("socket.io-client");
io.protocol
プロトコル改訂番号(現在:5)。
プロトコルは、クライアントとサーバー間で交換されるパケットのフォーマットを定義します。クライアントとサーバーの両方で同じ改訂番号を使用する必要があります。
詳細についてはこちらをご覧ください。
io([url][, options])
指定されたURLに対して新しいManager
を作成し、multiplex
オプションがfalse
で渡されない限り、後続の呼び出しに対して既存のManager
を再利用しようとします。このオプションを渡すことは、"force new connection": true
またはforceNew: true
を渡すことと同じです。
URLのパス名で指定された名前空間(デフォルトは/
)に対して、新しいSocket
インスタンスが返されます。たとえば、url
がhttp://localhost/users
の場合、http://localhost
にトランスポート接続が確立され、/users
にSocket.IO接続が確立されます。
クエリパラメーターは、query
オプションを使用するか、URLに直接指定することもできます(例:http://localhost/users?token=abc
)。
内部で行われる処理を理解するために、次の例
import { io } from "socket.io-client";
const socket = io("ws://example.com/my-namespace", {
reconnectionDelayMax: 10000,
auth: {
token: "123"
},
query: {
"my-key": "my-value"
}
});
は、簡略版です。
import { Manager } from "socket.io-client";
const manager = new Manager("ws://example.com", {
reconnectionDelayMax: 10000,
query: {
"my-key": "my-value"
}
});
const socket = manager.socket("/my-namespace", {
auth: {
token: "123"
}
});
利用可能なオプションの完全なリストはこちらにあります。
Manager


Manager
は、Engine.IO クライアントインスタンスを管理します。これは、(WebSocketやHTTPロングポーリングなどのトランスポートを使用して)サーバーへの接続を確立する低レベルのエンジンです。
Manager
は、再接続ロジックを処理します。
単一のManager
は、複数のSocketで使用できます。このマルチプレクシング機能の詳細についてはこちらをご覧ください。
ほとんどの場合、Manager
を直接使用せず、代わりにSocketインスタンスを使用することに注意してください。
コンストラクター
new Manager(url[, options])
利用可能なオプションの完全なリストはこちらにあります。
import { Manager } from "socket.io-client";
const manager = new Manager("https://example.com");
const socket = manager.socket("/"); // main namespace
const adminSocket = manager.socket("/admin"); // admin namespace
イベント
イベント: 'error'
error
<Error>
エラーオブジェクト
接続エラーが発生したときに発生します。
socket.io.on("error", (error) => {
// ...
});
イベント: 'ping'
サーバーからpingパケットを受信したときに発生します。
socket.io.on("ping", () => {
// ...
});
イベント: 'reconnect'
attempt
<数値>
再接続試行回数
正常に再接続されたときに発生します。
socket.io.on("reconnect", (attempt) => {
// ...
});
イベント: 'reconnect_attempt'
attempt
<数値>
再接続試行回数
再接続を試行したときに発生します。
socket.io.on("reconnect_attempt", (attempt) => {
// ...
});
イベント: 'reconnect_error'
error
<Error>
エラーオブジェクト
再接続試行エラーが発生したときに発生します。
socket.io.on("reconnect_error", (error) => {
// ...
});
イベント: 'reconnect_failed'
reconnectionAttempts
内で再接続できなかったときに発生します。
socket.io.on("reconnect_failed", () => {
// ...
});
メソッド
manager.connect([callback])
manager.open([callback])
autoConnect
がfalse
で初期化された場合、新しい接続試行を開始します。
callback
引数はオプションであり、試行が失敗/成功したときに呼び出されます。
import { Manager } from "socket.io-client";
const manager = new Manager("https://example.com", {
autoConnect: false
});
const socket = manager.socket("/");
manager.open((err) => {
if (err) {
// an error has occurred
} else {
// the connection was successfully established
}
});
manager.reconnection([value])
reconnection
オプションを設定するか、パラメーターが渡されなければそれを返します。
manager.reconnectionAttempts([value])
reconnectionAttempts
オプションを設定するか、パラメーターが渡されなければそれを返します。
manager.reconnectionDelay([value])
reconnectionDelay
オプションを設定するか、パラメーターが渡されなければそれを返します。
manager.reconnectionDelayMax([value])
reconnectionDelayMax
オプションを設定するか、パラメーターが渡されなければそれを返します。
manager.socket(nsp, options)
指定された名前空間に対して新しいSocket
を作成します。options
オブジェクトからはauth
({ auth: {key: "value"} }
)のみが読み取られます。他のキーは無視され、new Manager(nsp, options)
をインスタンス化するときに渡す必要があります。
manager.timeout([value])
timeout
オプションを設定するか、パラメーターが渡されなければそれを返します。
Socket


Socket
は、サーバーとやり取りするための基本クラスです。Socket
は特定の名前空間(デフォルトは/
)に属し、通信に基礎となるManagerを使用します。
Socket
は基本的にEventEmitterであり、ネットワーク経由でサーバーにイベントを送信し、サーバーからイベントを受信します。
socket.emit("hello", { a: "b", c: [] });
socket.on("hey", (...args) => {
// ...
});
詳細はこちらをご覧ください。
イベント
イベント: 'connect'
このイベントは、接続時と再接続時にSocketインスタンスによって発生します。
socket.on("connect", () => {
// ...
});
イベントハンドラーは、connect
ハンドラー自体で登録しないでください。Socketインスタンスが再接続するたびに、新しいハンドラーが登録されます。
悪い例 ⚠️
socket.on("connect", () => {
socket.on("data", () => { /* ... */ });
});
良い例 👍
socket.on("connect", () => {
// ...
});
socket.on("data", () => { /* ... */ });
イベント: 'connect_error'
error
<Error>
このイベントは、接続失敗時に発生します。
理由 | 自動再接続? |
---|---|
低レベルの接続を確立できません(一時的な障害) | ✅ はい |
接続がミドルウェア関数でサーバーによって拒否されました。 | ❌ いいえ |
socket.active
属性は、ソケットが短いランダム化された遅延後に自動的に再接続を試行するかどうかを示します。
socket.on("connect_error", (error) => {
if (socket.active) {
// temporary failure, the socket will automatically try to reconnect
} else {
// the connection was denied by the server
// in that case, `socket.connect()` must be manually called in order to reconnect
console.log(error.message);
}
});
イベント: 'disconnect'
reason
<文字列>
details
<DisconnectDetails>
このイベントは、切断時に発生します。
socket.on("disconnect", (reason, details) => {
// ...
});
考えられる理由のリストを以下に示します。
理由 | 説明 | 自動再接続? |
---|---|---|
ioサーバー切断 | socket.disconnect()を使用して、サーバーがソケットを強制的に切断しました。 | ❌ いいえ |
ioクライアント切断 | socket.disconnect()を使用して、ソケットを手動で切断しました。 | ❌ いいえ |
pingタイムアウト | pingInterval + pingTimeout の範囲内でサーバーからPINGが送信されませんでした。 | ✅ はい |
トランスポートのクローズ | 接続が閉じられました(例:ユーザーが接続を失った、またはネットワークがWiFiから4Gに変更された)。 | ✅ はい |
トランスポートエラー | 接続でエラーが発生しました(例:HTTPロングポーリングサイクル中にサーバーが強制終了された)。 | ✅ はい |
socket.active
属性は、ソケットが短いランダム化された遅延後に自動的に再接続を試行するかどうかを示します。
socket.on("disconnect", (reason) => {
if (socket.active) {
// temporary disconnection, the socket will automatically try to reconnect
} else {
// the connection was forcefully closed by the server or the client itself
// in that case, `socket.connect()` must be manually called in order to reconnect
console.log(reason);
}
});
属性
socket.active
ソケットが自動的に再接続を試行するかどうか。
この属性は、接続失敗後
socket.on("connect_error", (error) => {
if (socket.active) {
// temporary failure, the socket will automatically try to reconnect
} else {
// the connection was denied by the server
// in that case, `socket.connect()` must be manually called in order to reconnect
console.log(error.message);
}
});
または切断後に使用できます。
socket.on("disconnect", (reason) => {
if (socket.active) {
// temporary disconnection, the socket will automatically try to reconnect
} else {
// the connection was forcefully closed by the server or the client itself
// in that case, `socket.connect()` must be manually called in order to reconnect
console.log(reason);
}
});
socket.connected
ソケットが現在サーバーに接続されているかどうか。
const socket = io();
console.log(socket.connected); // false
socket.on("connect", () => {
console.log(socket.connected); // true
});
socket.disconnected
ソケットが現在サーバーから切断されているかどうか。
const socket = io();
console.log(socket.disconnected); // true
socket.on("connect", () => {
console.log(socket.disconnected); // false
});
socket.id
ソケットセッションの一意の識別子。connect
イベントのトリガー後に設定され、reconnect
イベント後も更新されます。
const socket = io();
console.log(socket.id); // undefined
socket.on("connect", () => {
console.log(socket.id); // "G5p5..."
});
id
属性は、アプリケーションで使用することを意図しない(デバッグ目的でのみ使用)**一時的な**IDです。なぜなら
- このIDは、再接続ごとに(たとえば、WebSocket接続が切断された場合、またはユーザーがページを更新した場合)再生成されるためです。
- 2つの異なるブラウザタブには、2つの異なるIDが割り当てられます。
- サーバー上に特定のIDに対して保存されているメッセージキューはありません(つまり、クライアントが切断された場合、このIDに送信されたサーバーからのメッセージは失われます)。
代わりに通常のセッションIDを使用してください(Cookieで送信するか、localStorageに保存してauth
ペイロードで送信します)。
参照
socket.io
基盤となるManagerへの参照。
socket.on("connect", () => {
const engine = socket.io.engine;
console.log(engine.transport.name); // in most cases, prints "polling"
engine.once("upgrade", () => {
// called when the transport is upgraded (i.e. from HTTP long-polling to WebSocket)
console.log(engine.transport.name); // in most cases, prints "websocket"
});
engine.on("packet", ({ type, data }) => {
// called for each packet received
});
engine.on("packetCreate", ({ type, data }) => {
// called for each packet sent
});
engine.on("drain", () => {
// called when the write buffer is drained
});
engine.on("close", (reason) => {
// called when the underlying connection is closed
});
});
socket.recovered
v4.6.0で追加
前回の再接続中に接続状態が正常に復旧されたかどうか。
socket.on("connect", () => {
if (socket.recovered) {
// any event missed during the disconnection period will be received now
} else {
// new or unrecoverable session
}
});
この機能の詳細についてはこちら。
メソッド
socket.close()
v1.0.0で追加
socket.disconnect()の同義語。
socket.compress(value)
後続のイベント発行に対する修飾子をセットします。値がtrue
の場合のみ、イベントデータは圧縮されます。メソッドを呼び出さない場合は、デフォルトでtrue
になります。
socket.compress(false).emit("an event", { some: "data" });
socket.connect()
v1.0.0で追加
- 戻り値
Socket
ソケットを手動で接続します。
const socket = io({
autoConnect: false
});
// ...
socket.connect();
手動での再接続にも使用できます。
socket.on("disconnect", () => {
socket.connect();
});
socket.disconnect()
v1.0.0で追加
- 戻り値
<Socket>
ソケットを手動で切断します。この場合、ソケットは再接続を試行しません。
関連付けられた切断理由
- クライアント側:
"io client disconnect"
- サーバー側:
"client namespace disconnect"
これがManagerの最後のアクティブなSocketインスタンスである場合、低レベルの接続が閉じられます。
socket.emit(eventName[, ...args][, ack])
eventName
<string>
|<symbol>
args
<any[]>
ack
<Function>
- 戻り値
true
文字列名で識別されるソケットにイベントを送信します。他のパラメーターを含めることができます。Buffer
を含むすべてのシリアル化可能なデータ構造がサポートされています。
socket.emit("hello", "world");
socket.emit("with-binary", 1, "2", { 3: "4", 5: Buffer.from([6, 7, 8]) });
ack
引数はオプションで、サーバーの応答で呼び出されます。
クライアント
socket.emit("hello", "world", (response) => {
console.log(response); // "got it"
});
サーバー
io.on("connection", (socket) => {
socket.on("hello", (arg, callback) => {
console.log(arg); // "world"
callback("got it");
});
});
socket.emitWithAck(eventName[, ...args])
v4.6.0で追加
eventName
<string>
|<symbol>
args
any[]
- 戻り値
Promise<any>
サーバーからの確認応答を期待してイベントを送信するPromiseベースのバージョン
// without timeout
const response = await socket.emitWithAck("hello", "world");
// with a specific timeout
try {
const response = await socket.timeout(10000).emitWithAck("hello", "world");
} catch (err) {
// the server did not acknowledge the event in the given delay
}
上記の例は、次と同等です。
// without timeout
socket.emit("hello", "world", (val) => {
// ...
});
// with a specific timeout
socket.timeout(10000).emit("hello", "world", (err, val) => {
// ...
});
受信側では
io.on("connection", (socket) => {
socket.on("hello", (arg1, callback) => {
callback("got it"); // only one argument is expected
});
});
Promiseをサポートしていない環境では、この機能を使用するためにポリフィルを追加する必要があります。
socket.listeners(eventName)
EventEmitterクラスから継承。
eventName
<string>
|<symbol>
- 戻り値
<Function[]>
eventName
という名前のイベントのリスナーの配列を返します。
socket.on("my-event", () => {
// ...
});
console.log(socket.listeners("my-event")); // prints [ [Function] ]
socket.listenersAny()
v3.0.0で追加
- 戻り値
<Function[]>
登録されているキャッチオールリスナーのリストを返します。
const listeners = socket.listenersAny();
socket.listenersAnyOutgoing()
v4.5.0で追加
- 戻り値
<Function[]>
発信パケットの登録済みキャッチオールリスナーのリストを返します。
const listeners = socket.listenersAnyOutgoing();
socket.off([eventName][, listener])
EventEmitterクラスから継承。
eventName
<string>
|<symbol>
listener
<Function>
- 戻り値
<Socket>
eventName
という名前のイベントのリスナー配列から指定されたlistener
を削除します。
const myListener = () => {
// ...
}
socket.on("my-event", myListener);
// then later
socket.off("my-event", myListener);
listener
引数は省略することもできます。
// remove all listeners for that event
socket.off("my-event");
// remove all listeners for all events
socket.off();
socket.offAny([listener])
v3.0.0で追加
listener
<Function>
以前に登録されたリスナーを削除します。リスナーが提供されない場合、すべてのキャッチオールリスナーが削除されます。
const myListener = () => { /* ... */ };
socket.onAny(myListener);
// then, later
socket.offAny(myListener);
socket.offAny();
socket.offAnyOutgoing([listener])
v4.5.0で追加
listener
<Function>
以前に登録されたリスナーを削除します。リスナーが提供されない場合、すべてのキャッチオールリスナーが削除されます。
const myListener = () => { /* ... */ };
socket.onAnyOutgoing(myListener);
// remove a single listener
socket.offAnyOutgoing(myListener);
// remove all listeners
socket.offAnyOutgoing();
socket.on(eventName, callback)
EventEmitterクラスから継承。
eventName
<string>
|<symbol>
listener
<Function>
- 戻り値
<Socket>
指定されたイベントの新しいハンドラーを登録します。
socket.on("news", (data) => {
console.log(data);
});
// with multiple arguments
socket.on("news", (arg1, arg2, arg3, arg4) => {
// ...
});
// with callback
socket.on("news", (cb) => {
cb(0);
});
socket.onAny(callback)
v3.0.0で追加
callback
<関数>
新しいキャッチオールリスナーを登録します。
socket.onAny((event, ...args) => {
console.log(`got ${event}`);
});
確認応答は、キャッチオールリスナーではキャッチされません。
socket.emit("foo", (value) => {
// ...
});
socket.onAnyOutgoing(() => {
// triggered when the event is sent
});
socket.onAny(() => {
// not triggered when the acknowledgement is received
});
socket.onAnyOutgoing(callback)
v4.5.0で追加
callback
<関数>
発信パケットの新しいキャッチオールリスナーを登録します。
socket.onAnyOutgoing((event, ...args) => {
console.log(`got ${event}`);
});
確認応答は、キャッチオールリスナーではキャッチされません。
socket.on("foo", (value, callback) => {
callback("OK");
});
socket.onAny(() => {
// triggered when the event is received
});
socket.onAnyOutgoing(() => {
// not triggered when the acknowledgement is sent
});
socket.once(eventName, callback)
EventEmitterクラスから継承。
eventName
<string>
|<symbol>
listener
<Function>
- 戻り値
<Socket>
eventName
という名前のイベントに対して、1回限りのlistener
関数を追加します。次回eventName
がトリガーされると、このリスナーは削除されてから呼び出されます。
socket.once("my-event", () => {
// ...
});
socket.open()
v1.0.0で追加
socket.connect()の同義語。
socket.prependAny(callback)
v3.0.0で追加
callback
<関数>
新しいキャッチオールリスナーを登録します。リスナーはリスナー配列の先頭に追加されます。
socket.prependAny((event, ...args) => {
console.log(`got ${event}`);
});
socket.prependAnyOutgoing(callback)
v4.5.0で追加
callback
<関数>
発信パケットの新しいキャッチオールリスナーを登録します。リスナーはリスナー配列の先頭に追加されます。
socket.prependAnyOutgoing((event, ...args) => {
console.log(`got ${event}`);
});
socket.send([...args][, ack])
args
<any[]>
ack
<Function>
- 戻り値
<Socket>
message
イベントを送信します。socket.emit(eventName[, ...args][, ack])を参照してください。
socket.timeout(value)
v4.4.0で追加
後続のイベント発行に対する修飾子をセットします。サーバーからの確認応答なしに指定されたミリ秒数が経過すると、コールバックがエラーで呼び出されます。
socket.timeout(5000).emit("my-event", (err) => {
if (err) {
// the server did not acknowledge the event in the given delay
}
});
フラグ
フラグ: 'volatile'
v3.0.0で追加
後続のイベント発行に対する修飾子をセットします。パケットは、次の場合に破棄される可能性があります。
- ソケットが接続されていない場合
- 低レベルのトランスポートが書き込み可能でない場合(たとえば、HTTPロングポーリングモードで
POST
リクエストが既に実行されている場合)。
socket.volatile.emit(/* ... */); // the server may or may not receive it