プラグインによるSocket接続
3つ目はプラグインによるSocket接続です。Adobe FlashやMicrosoft Silverlightなど、ブラウザにアドオンされた独自プラグイン上のクライアントプログラムから、サーバへSocket接続して通信します。
サーバ側、プラグイン側ともに通常のSocket通信プログラムなので、リアルタイム性が高くバイナリデータの送受信も可能です。また上述したポーリングやCometのような「HTTPプロトコルの制約」を受けないため、無駄な再接続もなく効率的です。
ただしプラグイン上にクライアントプログラムをロードするため、企業ユーザなどプラグインのインストールが禁じられている場合はそもそも利用できません。またHTML、JavaScript、CSSとは異なる各プラグイン独自の技術要素が必要になりますし、独自ポートで通信するためにネットワーク経路上にプロキシやファイアウォールがあると接続できない場合が多いのが難点です。
WebSocket
最後はWebSocketです。WebSocketはRFC6455として規格化されている「双方向通信用」のプロトコルであり、上述したポーリングやCometのような再接続を必要とする「重い仕組み」を打破する目的で策定されました。プラグインによるSocket接続と同様、接続が確立した後は全二重通信を行うことができ、バイナリデータの送受信も可能です。
一方、プラグインによるSocket接続とは異なり、独自プラグインのインストールを必要とせず、クライアント側のプログラムもJavaScriptで記述することができます。ポートもHTTPやHTTPSで利用する80や443に相乗りすることができるため、ファイアウォールがあっても通過しやすいことが利点です。
ただしGoogle ChromeやFirefoxの最新版など、WebSocketに対応したモダンブラウザでなければ動作しません。またWebSocketプロトコルを暗号化しない場合、ネットワーク経路上に通信のキャッシュやバッファリングを行うプロキシなどがあると、ポート80で疎通できたとしてもWebSocket接続を確立することができません。
http://www.websocket.org/echo.htmlやhttp://websocketstest.com/にアクセスすると、自分の環境でWebSocketが利用できるか確認することができます。一度試してみると良いでしょう。
Socket.IOとは
これまで見てきたように、リアルタイムWeb技術にはさまざまな実装があり、状況によって使い分けなければなりません。そこでSocket.IOが登場します。
Socket.IOは「リアルタイムWeb技術の実装方式を隠蔽し、すべてのブラウザ・モバイルデバイスでリアルタイム通信を可能とすること」を目指して開発されている、node.js用サーバ側ライブラリとブラウザ用JavaScriptライブラリのセットです。現バージョンの0.9系では、WebSocket、プラグインによるSocket接続(Adobe Flash Socket)、Comet(Ajax long polling、Ajax multipart streaming、Forever Iframe)、ポーリング(JSONP Polling)に対応しており、同じSocket.IO APIで透過的に利用することができます。
そのためSocket.IO APIを用いてサーバ側・ブラウザ側の実装を行えば、ネットワークやブラウザの状況から最適なリアルタイムWeb技術が選択され、IE5.5といった古いブラウザからiPhone/Androidのブラウザまで、幅広いブラウザでリアルタイム双方向通信が可能です。利用できるリアルタイムWeb技術とサポートしているブラウザの詳細はSocket.IO browser-supportを参照してください。複数のブラウザから異なるリアルタイムWeb技術で同時に接続されても、問題ありません。
またSocket.IO-Java(Socket.IO APIを実装したサーバ側Javaライブラリ)やsocket.io-java-client(Socket.IO APIを実装したクライアント側Javaライブラリ)など、サーバ側・クライアント側ともに、JavaScript以外の言語でもSocket.IO APIが利用できるようになってきています。さらに広がりを見せるSocket.IOは、これからも注目すべきライブラリでしょう。


