はじめに
Socket.IO を初めて使用する方は、チュートリアルをご覧ください。
Socket.IO とは
Socket.IO は、クライアントとサーバー間で**低遅延**、**双方向**、**イベントベース**の通信を可能にするライブラリです。


Socket.IO接続は、さまざまな低レベルトランスポートで確立できます。
- HTTPロングポーリング
- WebSocket
- WebTransport
Socket.IOは、次のように最適なオプションを自動的に選択します。
"動作原理"セクションで詳細を確認できます。
サーバー実装
言語 | ウェブサイト |
---|---|
JavaScript (Node.js) | - インストール手順 - API - ソースコード |
JavaScript (Deno) | https://github.com/socketio/socket.io-deno |
Java | https://github.com/mrniko/netty-socketio |
Java | https://github.com/trinopoty/socket.io-server-java |
Python | https://github.com/miguelgrinberg/python-socketio |
Golang | https://github.com/googollee/go-socket.io |
Rust | https://github.com/Totodore/socketioxide |
クライアント実装
言語 | ウェブサイト |
---|---|
JavaScript (ブラウザ、Node.js、またはReact Native) | - インストール手順 - API - ソースコード |
JavaScript (WeChatミニプログラム用) | https://github.com/weapp-socketio/weapp.socket.io |
Java | https://github.com/socketio/socket.io-client-java |
C++ | https://github.com/socketio/socket.io-client-cpp |
Swift | https://github.com/socketio/socket.io-client-swift |
Dart | https://github.com/rikulo/socket.io-client-dart |
Python | https://github.com/miguelgrinberg/python-socketio |
.Net | https://github.com/doghappy/socket.io-client-csharp |
Rust | https://github.com/1c3t3a/rust-socketio |
Kotlin | https://github.com/icerockdev/moko-socket-io |
PHP | https://github.com/ElephantIO/elephant.io |
Socket.IOではないもの
Socket.IOは**WebSocketの実装ではありません**。
Socket.IOは可能な場合にWebSocketをトランスポートに使用しますが、各パケットに追加のメタデータを追加します。そのため、WebSocketクライアントはSocket.IOサーバーに正常に接続できず、Socket.IOクライアントもプレーンなWebSocketサーバーに接続できません。
// WARNING: the client will NOT be able to connect!
const socket = io("ws://echo.websocket.org");
プレーンなWebSocketサーバーをお探しの場合は、wsまたはµWebSockets.jsをご覧ください。
Node.jsコアにWebSocketサーバーを含めるための議論もあります。
クライアント側では、robust-websocketパッケージに興味があるかもしれません。
Socket.IOは、モバイルアプリケーションのバックグラウンドサービスで使用することを目的としていません。
Socket.IOライブラリはサーバーへの開いているTCP接続を維持するため、ユーザーのバッテリー消費量が多くなる可能性があります。このユースケースには、FCMなどの専用のメッセージングプラットフォームを使用してください。
機能
Socket.IOがプレーンなWebSocketsよりも提供する機能を以下に示します。
HTTPロングポーリングフォールバック
WebSocket接続を確立できない場合、接続はHTTPロングポーリングにフォールバックします。
この機能は、10年以上前にプロジェクトが作成された当時、人々がSocket.IOを使用する最大の理由でした(!)ブラウザのWebSocketサポートはまだ初期段階にあったためです。
現在ほとんどのブラウザがWebSocketをサポートしている場合でも(97%以上)、誤って構成されたプロキシの後ろにいるユーザーからWebSocket接続を確立できないという報告を依然として受けているため、優れた機能です。
自動再接続
特定の状況下では、サーバーとクライアント間のWebSocket接続が中断され、両方がリンクの破損状態を認識しない場合があります。
そのため、Socket.IOには、接続の状態を定期的にチェックするハートビートメカニズムが含まれています。
そして、クライアントが最終的に切断されると、サーバーを圧倒しないように、指数バックオフ遅延で自動的に再接続されます。
パケットバッファリング
クライアントが切断されると、パケットは自動的にバッファリングされ、再接続時に送信されます。
詳細はこちらこちら.
確認応答
Socket.IOは、イベントを送信して応答を受信する便利な方法を提供します。
送信者
socket.emit("hello", "world", (response) => {
console.log(response); // "got it"
});
受信者
socket.on("hello", (arg, callback) => {
console.log(arg); // "world"
callback("got it");
});
タイムアウトを追加することもできます。
socket.timeout(5000).emit("hello", "world", (err, response) => {
if (err) {
// the other side did not acknowledge the event in the given delay
} else {
console.log(response); // "got it"
}
});
ブロードキャスト
サーバー側では、接続されているすべてのクライアントまたはクライアントのサブセットにイベントを送信できます。
// to all connected clients
io.emit("hello");
// to all connected clients in the "news" room
io.to("news").emit("hello");
これは複数のノードにスケーリングする場合にも機能します。
多重化
名前空間を使用すると、単一の共有接続でアプリケーションのロジックを分割できます。これは、たとえば、承認されたユーザーのみが参加できる「管理者」チャネルを作成する場合に役立ちます。
io.on("connection", (socket) => {
// classic users
});
io.of("/admin").on("connection", (socket) => {
// admin users
});
詳細はこちらこちら.
よくある質問
Socket.IOは現在でも必要ですか?
WebSocketがほぼどこでもサポートされているため、妥当な質問です。
とはいえ、アプリケーションにプレーンなWebSocketを使用すると、最終的には、再接続、確認応答、ブロードキャストなど、Socket.IOに既に含まれている(そして実証済みの)機能のほとんどを実装する必要があると考えています。
Socket.IOプロトコルのオーバーヘッドは?
socket.emit("hello", "world")
は、42["hello","world"]
を含む単一のWebSocketフレームとして送信されます。
4
はEngine.IOの「メッセージ」パケットタイプです。2
はSocket.IOの「メッセージ」パケットタイプです。["hello","world"]
は、引数配列のJSON.stringify()
されたバージョンです。
そのため、各メッセージごとに数バイトの追加バイトが必要になりますが、カスタムパーサーを使用することでさらに削減できます。
ブラウザバンドルのサイズは10.4 kB
(縮小してgzip圧縮)です。
Socket.IOプロトコルの詳細はこちらこちら.
正常に動作しません。お手伝いいただけますか?
弊社のトラブルシューティングガイドをご確認ください。