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でやろうとするとこんな感じになります。

GistにThis user has no public gistsと出た時の対応

publicなgistがあるのに自分のページ(https://gist.github.com/[UserName])に
f:id:chitans:20120707152806p:plain
と出てしまうユーザがいるようです。私もそのひとりでした。

解決方法は、Contactのページ(https://github.com/contact)から

publicなgistがあるんだけど、This user has no public gistsってでるよ?どうすりゃいいの?

みたいな内容の英文を書いて送ると直してくれます。
私のときは、一時間ほどで直してくれました。

WindowsとEclipseとJetty8.1でHelloJettyしてみた

用意したもの

  • WindowsXP
  • Eclipse3.7
  • JDK1.6
  • Jetty8.1

Jettyのインストールと起動確認

以下のページからJetty8.1のzipファイルをダウンロードします。
http://download.eclipse.org/jetty/

ダウンロードしたファイルを適当なフォルダ(C:¥Jetty81¥)に解凍します。

コマンドプロンプトを起動し、

> java -jar start.jar

を実行します。

http://localhost:8080/にアクセスし、Welcome to Jetty8が表示されればインストール完了です。
f:id:chitans:20120630135213p:plain

Eclipseプラグイン(Jetty WTP)のインストール

Eclipseのプラグインをインストールします。

Eclipseのメニューから、ヘルプ ⇒ 新規ソフトウェアのインストールを選択し、以下にアクセスします。
http://download.eclipse.org/jetty/updates/jetty-wtp

Jetty WTP Adaptor Siteにチェックを付けて、インストールします。

Jetty Serverの設定

パッケージエクスプローラを右クリック ⇒ 新規 ⇒ その他 ⇒ サーバ ⇒ サーバを選択します。

Jetty8.1 Serverを選択して次へ。

Jetty installation directoryにC:¥Jetty81¥を指定して完了。

サーバービューを開くといま作成したJettyサーバが表示されます。
右クリックで起動、停止ができます。
f:id:chitans:20120630135226p:plain

Jetty WTP Dynamic Web Projectの作成

パッケージエクスプローラを右クリック ⇒ 新規 ⇒ その他 ⇒ Web ⇒ 動的Webプロジェクトを選択します。

プロジェクト名を適当に入力して完了。

動作確認のため、作成したプロジェクトのWebContent直下にindex.htmlを作成します。

<!DOCTYPE html>
<html>
<meta charset="UTF-8">
<title>Hello Jetty!</title>
<h1>Hello Jetty!</h1>
</html>

プロジェクトエクスプローラに表示されているプロジェクトをサーバビューにドラッグ&ドロップ

Jetty Serverを右クリックし開始。

コンソールに

java.lang.NoClassDefFoundError: org/objectweb/asm/ClassVisitor
java.lang.ClassNotFoundException: org.objectweb.asm.ClassVisitor

のような例外が発生したら、Jetty Serverを停止し、サーバービューに表示されているJetty Serverをダブルクリックし、設定画面を開きます。一般情報の起動構成を開くをクリックし、クラスタブを開きます。ユーザ・エントリーを選択し、外部Jar追加ボタンをクリックします。Jettyインストールフォルダのlib¥annotations¥にある

  • javax.annotation-***.jar
  • org.objectweb.asm-***.jar

のふたつのファイルを追加します。

もう一度、サーバービューからJetty Serverを起動すると例外が発生せず起動するはずです。
f:id:chitans:20120630135229p:plain

Wellcom to Jetty!!

Android4.1 SDKインストール時の注意点

Android4.1SDK(API16)が出たので、早速インストールしてみました。
その時の注意点です。

プロジェクト作成プロセスの最後にAndroid Support Libraryがないと言われる。

インストールしましょう。Android SDK ManagerのExtrasからインストールできます。

プロジェクト作成を選択してもダイアログが表示されない。

新しいADTがEclipseに認識されていません。Eclipseにcleanオプションを付けて起動してみましょう。

Android技術者認定試験を受けてきた

Android技術者認定試験には、分野や難易度に応じていくつかの区分が設けられていますが、現時点で受験できるのは、「Androidアプリケーション技術者認定試験(ベーシック)」のみ。結果は合格でした。
私のスペックは、

  • プライベートでAndroidアプリのコードを読み始めてから1年くらい
  • 仕事でAndroidアプリのコードを触り始めて半年くらい
  • 試験対策本を読み始めて3ヶ月くらい
  • SJC-PSJC-WC保有

マーケットに出したアプリはありません。意識してコードを読み書きしたのは、仕事で使いようになってからなので、実質経験は6ヶ月でしょうか。試験対策本は、国内で出版されている3冊を全て読みました。

Androidアプリケーション技術者認定試験 ベーシック対策実践問題集

Androidアプリケーション技術者認定試験 ベーシック対策実践問題集


徹底攻略 Androidアプリケーション技術者認定試験ベーシック問題集 (ITプロ/ITエンジニアのための徹底攻略)

徹底攻略 Androidアプリケーション技術者認定試験ベーシック問題集 (ITプロ/ITエンジニアのための徹底攻略)


携帯OS教科書 Androidアプリケーション技術者ベーシック

携帯OS教科書 Androidアプリケーション技術者ベーシック


どの参考書もやって良かったと思うけど、どれか1冊と言われたら3冊目の本かな。他の2冊に載っていないことが書かれていて、試験にも出題されていました。
試験の難易度は思ってたより難しかったですが、Androidアプリケーション開発の知識を体系的に学ぶには良い試験だと思います。3冊の対策本を読んでおけば出題範囲はほぼ網羅できますが、対策本に載っていなくて出題されたのは、タブの使い方でした。1問だけでしたが、気になる人はチェックしておいた方が良いかもしれません。