JettyでWebSocket
今週末にあるHTML5 for Mobile Hackathonに向けて、何か作れないかなーと考えていたところ、
やっぱりサーバ使わないと無理(>_<)ということで、WebSocketの勉強がてらチャットアプリを作ってみました。
WebSocketとは
WebSocketをあんまり知らない人はこちらの資料が分かりやすいと思います。
チャットアプリ作成の参考にした記事
やったこと
- m2eclipseのインストール
- 参考にした記事を元にチャットアプリ作成
- Jettyのバージョンの違いに苦戦
- サーバにJavaとJettyインストール
- 8080番ポートを開放(参考記事だと使ってるポート8040かも)
- デプロイ
- やり方が分からず焦る
引っかかったところ
すごい丁寧な記事だったのでコピペであっという間に終わるかなーと思ってたのですが、
予想以上に時間くってしまったので引っかかったところをメモしていきます。
- m2eclipseのインストール
- Jettyのバージョンの違い
- デプロイ方法
m2eclipseのインストール
参考にした記事では、maven使ってたのでm2eclipseをインストールしました。
ちょい戸惑ったのですが以下の手順で出来るはずです。
手順
- インストール
- 再起動
- eclipse.iniの-vmと、インストール済みのJREにJDKを指定しろというダイアログが表示。
- EclipseとMavenでGWTアプリケーションを作成する:01 事前準備 - paz3のおもいつき を参考に対応
- 再起動
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のファイル置き場
作ったもののソース
ソースは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の作り方とか色々調べたりしちゃいました。
で色々調べてるうちに、