WebSocket とは

WebSocketWeb でリアルタイムで双方向通信するプロトコルです。 ws:wss: などのURI スキームでクライントとサーバでデータ通信します。

ポーリングとは

ポーリングは、クライアントが一定間隔サーバに HTTPリクエストする方法です。 例えばチャットが書き込まれたかサーバに数秒後に確認することで、リアルタイム性を実現させます。また、サーバからクライアントに擬似的にプッシュするロングポーリング(Comet) 方式もあります。

HTTP のメリット

Ajax のようにHTTP はリクエスト&レスポンスするたびに新しいコネクションを確立するため、比較的速度が遅くなる傾向にあります。 WebSocket を利用すると低コスト通信で、Ajax よりもリアルタイム性を実現しやすくなります。

Socket.io とは

Socket.io は、Node.js で WebSocket を利用するモジュールです。

Socket.io 公式

WebSocket だけでなく、Ajax ロングポーリングをはじめとする複雑な通信にも対応しています。また、クライアントアプリの機能もあり、プログラムしやすいのも特徴です。

サーバ

Socket.io ではクライアントとサーバ両方のプログラムを開発できます。まずサーバ側の基本機能です。

インストール

Socket.io を利用するには、npmsocket.io をインストールします。

npm i socket.io

on イベント

Socket.io の通信には、クライアントとサーバの接続を確立する必要があります。on() イベントを利用すると、接続、切断をはじめとするイベントを登録できます。

io を直接利用する場合

on() にイベント名を指定して、コールバック関数でデータを取得します

io.on(イベント名, (データ) => {
    //処理
})

socket を利用する場合

socket.on(イベント名, (データ) => {
    //処理
})

connection イベント

connection イベントは Socketが接続確立すると呼ばれます。 コールバック関数の引数には、socket オブジェクトが利用できます。

io.on('connection', (socket) => {
    //処理
})

disconnect イベント

disconnect イベントは Socketが切断すると呼ばれます。

socket.on('disconnect', () => {
    //処理
})

ルームを利用する場合

チャットのようなルームを指定して、送信先を振り分けることもできます。

io.of('/').in(ルーム名).clients(err, clients => {
    //処理
})

データ送信 emit()

サーバからクライアントにデータ送信するには、emit() メソッドを利用します。 データ送信の方法はいくつかあるので、状況によって使い分けます。

すべてのクライアントに送信

ioemit() すると、すべてのクライアントに送信します。

io.emit(イベント名, データ);

送信者のみに送信

socketemit() すると、送信者のみに送信します。

socket.emit(イベント名, データ);

ブロードキャスト送信

ブロードキャスト送信は、送信者以外のすべてのクライアント送信します。

io.broadcast.emit(イベント名, データ);
//または
socket.broadcast.emit(イベント名, データ);

特定のクライアントに送信

Socket ID を指定して、特定のクライアントに送信します。

io.to(SocketID).emit(イベント名, データ);

特定のルームに送信

io.to() で、ルーム(グループ)ごとに送信します。

io.to(ルーム名).emit(イベント名, データ);

クライアント

クライアントもサーバと同じような記述で Socket.io を利用できます。 node_modules にインストールされた socket.io.js を利用します。

Socket.io クライアントのインストール

head タグで socket.io.js をインストールします。

<script type="text/javascript" src="/socket.io/socket.io.js"></script>

connection イベント

サーバ同様に connection イベントが利用できます。socket.idsocket.connected で接続の ID や状況が確認できます。

socket.on('connect', () => {
    console.log(socket.id);
    console.log(socket.connected);
});

disconnect イベント

サーバ同様に disconnect イベントが利用できます。

socket.on('disconnect', () => {
    //処理
})

サーバに送信

socket.emit() メソッドでクライアントからサーバの送信します。イベント名は、サーバの設定にあわせます。

socket.emit(イベント名, データ);

サーバから受信

socket.on() で接続した socket に対するイベントを登録します。イベント名はサーバとあわせておきます。

socket.on(イベント名, (data) => {
    //処理
})