JettyでWebSocket

今週末にあるHTML5 for Mobile Hackathonに向けて、何か作れないかなーと考えていたところ、
やっぱりサーバ使わないと無理(>_<)ということで、WebSocketの勉強がてらチャットアプリを作ってみました。

WebSocketとは

WebSocketをあんまり知らない人はこちらの資料が分かりやすいと思います。

チャットアプリ作成の参考にした記事

Jettyで始めるWebSocket超入門:特集|gihyo.jp … 技術評論社

やったこと

  1. m2eclipseのインストール
  2. 参考にした記事を元にチャットアプリ作成
    • Jettyのバージョンの違いに苦戦
  3. サーバにJavaとJettyインストール
  4. 8080番ポートを開放(参考記事だと使ってるポート8040かも)
  5. デプロイ
    • やり方が分からず焦る

引っかかったところ

すごい丁寧な記事だったのでコピペであっという間に終わるかなーと思ってたのですが、
予想以上に時間くってしまったので引っかかったところをメモしていきます。

  • m2eclipseのインストール
  • Jettyのバージョンの違い
  • デプロイ方法

m2eclipseのインストール

参考にした記事では、maven使ってたのでm2eclipseをインストールしました。
ちょい戸惑ったのですが以下の手順で出来るはずです。

手順
  1. インストール
  2. 再起動
  3. eclipse.iniの-vmと、インストール済みのJREJDKを指定しろというダイアログが表示。
  4. EclipseとMavenでGWTアプリケーションを作成する:01 事前準備 - paz3のおもいつき を参考に対応
  5. 再起動

Jettyのバージョンの違い

参考にした記事が結構前のだったので使われてるJettyのバージョンが古く、どうせ使うなら最新のにしちゃえと最新っぽい7.4.5.v20110725を使っていたら、
WebSocketクラスの中身が結構変わっていて戸惑いました。。

こんな感じ
package webSocketChat;

import java.io.IOException;
import java.util.Set;
import java.util.concurrent.CopyOnWriteArraySet;

import org.eclipse.jetty.websocket.WebSocket;

public class MyWebSocket implements WebSocket.OnTextMessage {

	Connection outbound;
	private static Set<MyWebSocket> socketSet = new CopyOnWriteArraySet<MyWebSocket>();
	
	@Override
	public void onClose(int arg0, String arg1) {
		// TODO 自動生成されたメソッド・スタブ
		socketSet.remove(this);
	}

	@Override
	public void onOpen(Connection outbound) {
		// TODO 自動生成されたメソッド・スタブ
		this.outbound = outbound;
		socketSet.add(this);
	}
	
	@Override
	public void onMessage(String data) {
		for (MyWebSocket socket : socketSet) {
			try {
				socket.outbound.sendMessage(data);
			} catch (IOException e) {
				e.printStackTrace();
			}
		}
	}
}
Jettyのファイル置き場

Central Repository: org/eclipse/jetty

作ったもののソース

ソースはGitHubに置いといたんで参考にしてください。変なとこあったらおせーて><
GitHub - u1fukui/WebSocketChat: websocket/jetty sample



あと、Eclipseで実行したあと、起動したサーバを終了することなく、コードを修正して再実行!とかしてたんで、コードの修正が反映されなくてしばらく悩んでたりしました(´Д`)

デプロイ方法

ローカルで動かしてるだけだと面白くないよねーってことで、
さくらVPSにデプロイしよう!と思ってここでもハマりました。


JavaとJettyのインストールはすんなりいったのですが、作ったチャットアプリを動かす方法がさっぱりでした。
結論から言えば、参考した記事に書いてある通り「java -jar WebSocketChat-0.0.1-SNAPSHOT.jar」でいけたのですが、
実行する場所がおかしかったせいでエラーが発生して、そこからpom.xml, web.xml, Jettyのデプロイ方法, warの作り方とか色々調べたりしちゃいました。


で色々調べてるうちに、

  • このチャットアプリはjarファイル単体で動く
  • jarファイルは、jettyのlibディレクトリと同じディレクトリ層に置いて実行する
    • META=INFの下にあるMANIFEST.MFに書いてあるクラスパスを見て気づく

という事が分かり、無事動きました。

感想

  • WebSocketのプロトコル早く決まってほしい(もうLastCallみたい)
  • Jettyの情報少ない
  • というかServletとか基本的な知識が足りない(´Д`)
  • Node.js使ってみたい
  • やたら手間取ったけど、結果的にJettyとMavenの理解が深まってよかった
  • WebSocket面白い