WebSocketを使える主なWebサーバとその実装状況
先週はWebサーバとWebブラウザの間で双方向通信を実現する「WebSocket」について解説した。それに引き続き、今回はWebSocketプロトコルをサポートする主なWebサーバと、本稿執筆時点での実装状況を紹介したい。
WebSocketプロトコル仕様のドラフトの種類
WebSocketプロトコルの仕様は、RFC6455として登録される以前からドラフトが公開されていた。ただし、頻繁に改訂が行われてきたためリビジョンごとに互換性がない場合もある。Webサーバ側の実装はその改訂を追いかける形になっているため、Webサーバを選ぶ上では、どの実装がどのリビジョンに対応しているのか把握することが必要になる。
仕様の策定を進めているIETFでは、当初「draft-hixie-thewebsocketprotocol-xx」(xxはリビジョン番号)の名前でドラフトを公開していたが、ビジョン76以後は名称が「draft-ietf-hybi-thewebsocketprotocol-xx」に変更され、その際にリビジョン番号も00にリセットされた。便宜上、ここでは前者を「hixie-xx」、後者を「hybi-xx」と書く。
hixie-00登場前はhybi-75とhybi-76が主流だったが、この2つのリビジョンには互換性がないため、しばらくは両者が混在する状況が続いていた。また、hybi-03以前のプロトコルにはセキュリティホールが存在することが確認されている。hybiのドラフトは17まで進められ、それをベースにRFC6455のドラフトが作成された。
hybi-04からはプロトコル上のバージョンを表すSec-WebSocket-Version:の値とドラフトのリビジョン番号の対応が行われたため、HTTPヘッダ情報を見ることでどのドラフトに対応するのかが一目でわかるようになった。ただし、hybi-08からhybi-12まではすべてSec-WebSocket-Versionが「8」、hybi-13からhybi-17までとRFC6455はすべて「13」となっている。したがってWebサーバの実装状況としては、hybi-03以前、hybi-04から07、hybi-08から12、hybi-13以降という区切りが目安にできる。
Jetty
JettyはJavaで作成されたHTTPサーバである。Java Servletコンテナとしての機能を有しており、サイズが小さいことからWebサービスを提供するアプリケーションに組み込んで利用しやすい点が大きな特徴だ。
Jettyは早い段階からWebSocketのサポートを実施してきたWebサーバ実装としても知られており、バージョン7.xおよび8.xでWebSocketを利用することができる。最新の安定版は7.5.4および8.0.4で、この段階ではhybi-13の仕様に対応している。ただし、開発リポジトリにはすでにRFC6455に対応したコードのコミットが始められている。したがって現在開発が進められている7.6.0や8.1.0のRC版はRFC6455対応という形になりそうだ。
jWebSocket
jWebSocketは、WebSocketをサポートしたWebサーバおよびクライアントの実装である。サーバ側はJavaで、クライアント側はJavaScriptで実装されており、LGPLに基づいて公開されている。
サーバ実装は、スタンドアロンのWebサーバとして実行するほか、jWebSocket自身をWebアプリケーションとしてJavaアプリケーションサーバにデプロイしたり、自前のWebアプリケーションに組み込んで利用することができる。
jWebSocketは現在バージョン1.0b5まで公開されているが、WebSocket仕様については、1.0b1以降においてhixie-75とhixie-76およびhybi-7からhybi-14への対応が完了しているとのこと。ちなみにjWebSocketでは内部で利用するJettyライブラリが同梱されているが、そのバージョンは1.0b5の時点で8.0.0RC0となっている。
node.js(Socket.IOとNode WebSocket Server)
node.jsはサーバーサイドJavaScriptフレームワークの一種である。サーバーサイドJavaScriptを利用する場合、Webアプリケーションのサーバ側の機能もJavaScriptで実装することができるため、クライアントプログラムとのシームレスな連携が行えるというメリットがある。WebSocketを利用する場合においても、WebSocket APIがJavaScriptをベースとしたものであるため、このメリットは大きい。
node.jsでWebSocketを利用するおもな選択肢としては、Socket.IOを利用する方法と、Node WebSocket Serverを利用する方法の2つがある。いずれもnode.jsをWebSocket対応にするモジュールであり、npm(Node Package Manager)を利用して簡単に追加することができる。また、最新のコードはGitHubのリポジトリ(Socket.IO、Node WebSocket Server)から入手できる。
Socket.IOの最新版はNode 0.6に対応した0.8.7で、WebScoketの実装はhyBi-16をサポートしている。一方でNode WebSocket Serverはhixie-75とhixie-76をサポートしたv1.4.04以降バージョンが切られていない。ただし、リポジトリ上ではhybi-10およびhybi-16に対応するコードがコミットされているので、利用する場合はGitHubから最新のコードを入手するのがいいだろう。
Grizzly
GrizzlyはJavaで作られたWebサーバアプリケーションである。Java EEアプリケーションサーバ「GlassFish」のサブプロジェクトとして開発されているもので、HTTP以外にも、TCPやUDP、TLS、FTP、SIPといった多種のプロトコルによる通信をサポートしている点が大きな特徴。
Grizzlyの最新版はバージョン2.1.8および1.9.43で、いずれもhybi-17に対応した実装が含まれている。この実装はgrizzly-websockets.jarとしてパッケージングされている。
さいごに
ここで紹介した以外にもWebSocket対応のWebサーバ実装は多数あるが、いずれにしても使用する際にはどのリビジョンにもとづいた実装なのかという点に注意して選ぶ必要がある。当然ながら、RFC6455の最新のドラフトか、それに近いhybi-13以降に対応していることが望ましいだろう。
キーワード解説一覧
- ついにRFCに登場!Webサーバとの双方向通信を実現する「WebSocket」
- 主要NoSQLの種類と特性を整理--分散DBMS「Cassandra」も解説
- Facebookが公開したPHP仮想マシン「HipHop VM」とは
- jQuery Mobileがモバイルサイト開発でスタンダードの地位を築けた理由
- モバイル向けFlash終了でHTML5大勝利!と安心していられない理由
- 統計解析のための専用言語R(R言語)とは
- Eclipseプロジェクトによって開発された新言語「Eclipse Xtend」
- HTML5をサポートした次期Kindleフォーマット「Kindle Format 8」の狙い
- Googleが発表した「Dart」って何?
Keep up with ZDNet Japan
ZDNet JapanはFacebookページ、Twitter、RSS、Newsletter(メールマガジン)でも情報を配信しています。
- コメント(1件)
- ホワイトペーパー



本稿の初出時、node.jsのパッケージマネージャ「Node Package Manager」を「nmp」と記載していましたが、正しくは「npm」でしたので、修正しました。
はてなブックマークでご指摘くださった読者の方にお礼申し上げます。ありがとうございました。