AndroidアプリにJettyを組込む

最近、Jettyを組込みで動作させた案件があったのですが、たまたまAndroidでアプリを作っていてWebサーバを動かしてみようかな?と思いたちました。

検索してみると、i-jJettyというのがあったのですが、サーバの実体が見当たらなかったので、せっかくですので普通のJettyを組込んでみました。

JettyはTomcatのようなサーブレットコンテナですね。実際はどうかよくわかりませんが軽量で有名です。今回はこれをアプリとして作りこんでAndroid端末をWebサーバに仕立ててみます。
eclipseの http://www.eclipse.org/jetty/ から任意のバージョンをダウンロードしてきます。私は7.4.5を使っています。で、以下のjarをビルドパスに追加します。

jetty-continuation-*.jar
jetty-http-*.jar
jetty-io-*.jar
jetty-server-*.jar
jetty-servlet-*.jar
jetty-security-*.jar
jetty-util-*.jar
servlet-api-*.jar

ポイントとしては、各jarにabout.htmlが含まれていますが、apkを作る時にエラーが出てしまうので各jarから抜いておくことをお勧めします。about.htmlにはライセンスについて書かれていますので、良く読んでおきましょう。

サーバを起動する部分のメソッドはこんな感じです。onCreate()あたりから呼び出します。nioは動きそうも無かったので通常のSocketConnectorでコネクタを設定し、サーブレットのハンドラを登録します。TestServletはHttpServletを継承したサーブレットのクラスです。

private void initServer() {
  _server = new Server();
  SocketConnector connector = new SocketConnector();
  connector.setPort(8080);
  _server.addConnector(connector);
  ServletContextHandler servletContext = new ServletContextHandler();
  ServletHolder holder = new ServletHolder(TestServlet.class);
  servletContext.addServlet(holder, "/*");
 
  HandlerList list = new HandlerList();
  list.addHandler(servletContext);
  _server.setHandler(list);
 
  try {
    _server.start();
    int port = _server.getConnectors()[0].getLocalPort();
    Log.d("server", String.format("server port(%d) start", port));
    Toast.makeText(this, R.string.server_started, Toast.LENGTH_LONG).show();
  } catch (Exception ex) {
    Log.w("server", ex);
    ex.printStackTrace();
  }
}

止める方もこんな感じで、こちらはonDestroy()から呼出します。

private void stopServer() {
  if (_server != null) {
    try {
      int port = _server.getConnectors()[0].getLocalPort();
      _server.stop();
      Log.d("server", String.format("server port(%d) stop", port));
    } catch (Exception ex) {
      Log.w("server", ex);
      ex.printStackTrace();
    }
  }
}

予め実機のIPアドレスをWIFIの設定画面などで調べておいてから、アプリをデバック起動します。うまくサーバが起動するとトーストが出ます。ブラウザで http://(端末のIP):8080 にアクセスするとTestServletの内容が表示されます。
アプリを終了すると、ログに「server port (8080) stop」が出力されます。もちろんアクセスしてもつながらなくなります。

さて、上記のようなJettyの使い方ですが、必要なコンポーネントしか登録しないで利用しているので、普通に利用するよりは多少軽量になると思います。これはデスクトップ向けのアプリケーションにwebサーバを組込んで利用したい場合も同様だと思いますのでうまく活用したいですね。ただ、サーバソケットを立てるのが普通の携帯端末でうまくいくかどうか微妙なラインかもしれません。私は組込みで使用したいので、今はrootedなデバイスで動かしています。後でAndroid携帯で試してみます。(9/1追記)素のIS03で試してみましたがちゃんとWIFI経由でIS03内のサーバにアクセスできましたね!!

私はこの仕組みとWebViewを使って、Flashのアプリケーションでドメインを超えた部分をJetty上のサーブレットにやらせようと思っています。AIR3.0がリリースされるのを待てという話もありますがw

コメント

タイトルとURLをコピーしました