Tomcat7でWebSocketを使ってみた

※Tomcat7.0.52対応サンプルプログラムはこちら。

今更感もありますが、Tomcat7でWebSocketがサポートされましたので、簡単なサンプル(チャットアプリ)を書いてみました。WebSocketを使えばもっと色々なことができそうなのですが、動作確認を含めたサンプルということで...

まずはソースです。3つありますが、上からHTML、web.xmlJavaです。


HTML

7行目でWebSocketオブジェクトを作成します。スキームはwsです。
8行目のonopenは接続が完了したタイミングで実行されます。今回は何も書いていません。
10行目のonmessageはメッセージを受信したタイピングで実行されます。今回はチャットメッセージが送られてきますので、document.getElementById()を使って画面を更新します。
14行目のsendでサーバにメッセージを送信します。

web.xml

特別なことはしていません。リクエストがきたら、サーブレットを実行します。

Java

コードを書く前の準備として、

  • [Tomcatインストールディレクトリ]/lib/catalina.jar
  • [Tomcatインストールディレクトリ]/lib/tomcat-coyote.jar

にBuildパスを通しておきます。
WebSocketを使用するクラスは、WebSocketServletクラスをスーパークラスに指定します。
15行目のmmiListでクライアントごとのオブジェクトをArrayListに格納しています。クライアントからのオブジェクト生成リクエストがあると17行目のcreateWebSocketInbound()が実行されます。戻り値はMessageInboundのサブクラスのオブジェクトです。
25行目のonOpen()は接続されたとき、37行目のonClose()は切断されたとき、43行目のonTextMessage()はメッセージを受信したときにそれぞれ実行されます。onTextMessage()の引数はCharBuffer型です。クライアントにメッセージを投げる時には、writeTextMessage()を使用します。

ちなみに、これと同じことをJetty8でやろうとするとこんな感じになります。