WebSocketを使える主なWebサーバとその実装状況

杉山貴章(オングス)
2012-01-12 09:30:00
  • このエントリーをはてなブックマークに追加

 先週は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.IONode 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以降に対応していることが望ましいだろう。

キーワード解説一覧

Keep up with ZDNet Japan
ZDNet JapanはFacebookページTwitterRSSNewsletter(メールマガジン)でも情報を配信しています。

  • コメント(1件)
#1 builder編集部   2012-01-12 11:14:07
builder編集部です。

本稿の初出時、node.jsのパッケージマネージャ「Node Package Manager」を「nmp」と記載していましたが、正しくは「npm」でしたので、修正しました。

はてなブックマークでご指摘くださった読者の方にお礼申し上げます。ありがとうございました。
  • 新着記事
  • 特集
  • ブログ