ケータイJavaのいろは 最終回 スクラッチ・パッドとネットワーク接続


IDGジャパン JavaWorld 2001年11月号 に掲載された記事の原文を公開します。 編集の手がかなり加えられて掲載されたため、 雑誌に掲載されたものとは異なる部分があります (無断転載禁止)。

ネットワーク・スクラッチパッド / FrogClimber ゲーム / 記録の保存 / 記録のランキング / 終わりに / 戻る / トップページ


ネットワーク・スクラッチパッド

Java2ME CLDC ではネットワーク接続やファイルの読み書きなどの 全ての入出力を統一した方法で扱うように作られています。 Java2ME CLDC に分類されている i モード対応 Java プロファイルでも ネットワーク接続やスクラッチパッドへの読み書きをこの方法で扱っています。
 
今回は本連載の前回 (第 5 回) に使用した簡単なサンプルゲームを 改良することで、として取上げ、 ネットワークやスクラッチパッドの使用方法を説明します。

FrogClimber ゲーム

前回使用し、これから改良することでネットワークや スクラッチパッドの使用方法のサンプルとする、 FrogClimber ゲームの概要について改めて説明します。
 
これはカエルを左右に移動、ジャンプさせながら上へ上へと 登っていくゲームです (画面1)。ゲームを開始すると、 プレーヤーが操作するカエルといくつかのボールが表示されます。 左右キーでカエルを左右に移動させ、決定キーまたは上キーで ジャンプさせることができます。 カエルがボールにぶつかると、ボールにはじかれます。 カエルを上手に操作してボールに上側からぶつかることで より高く飛ぶことができるので、この事を利用してより上へと登ります。 カエルが画面上部に近づくと自動的にスクロールします。 そして、カエルがこれまでに飛んだ高さの最高値を ソフト・キーのラベルに表示しています。
 

FrogClimber.java

 
このプログラムは FrogClimber.javaFrogClimberCanvas.java の 二つのソースファイルから構成されています。FrogClimber.java は IApplication クラスを継承した起動用のクラスです。 FrogClimberCanvas.java はゲームのメインを記述しています。 今回は FrogClimberCanvas.java を改良していきます。
 
(図1 FrogClimber.java の実行結果)
 

Generic Connection

 
Java2ME CLDC ではネットワーク (HTTP など)、 ファイルなど全ての入出力への接続を簡単に、メモリの消費を抑え、 そして汎用的に扱えるようにするため、 Generic Connection フレームワークを採用しています。 Generic Connection フレームワークとは全ての入出力への接続を 同じクラスを使って統一的に扱う仕組みです。 Java2ME CLDC に基づいている i モード対応 Java プロファイルも 当然このフレームワークに従います。 i モード対応 Java プロファイルでは HTTP、HTTPS、スクラッチパッド、 リソース (Jar ファイルの中にあるファイル) への接続が Generic Connection フレームワークに基づいて使用出来ます。
 
Generic Connection フレームワークでは接続先を 「プロトコル : 位置 パラメータ」で表現します。 プロトコルで接続の種類を示し (表 1)、パラメータの有無は任意です。
 
プロトコル接続先の種類
http ネットワーク (HTTP)
https ネットワーク (HTTPS)
scratchpadスクラッチパッド
resource Jar ファイル中のリソース
(表1 プロトコル一覧)
 
javax.microedition.io.Connector クラスの open(String name,int mode) クラスメソッドで接続先と 入出力モードを指定すると Connection オブジェクトが得られます。 Connection インターフェースは文字通り接続を表すインターフェースで、 実際には接続先に応じて Connection インターフェースを継承した インターフェースが使われます。 入出力モードには読み込み (Connector.READ)、書き込み (Connector.WRITE)、 その両方 (Connector.READ_WRITE) のいずれかを指定します。 そして、Connection オブジェクトからストリームの取得や、 接続の設定、情報の取得などを行います。 各プロトコルごとの具体的な使用方法については サンプルを使って順に説明していきます。

記録の保存

まずは、カエルがこれまでに飛んだ高さの最高値をスクラッチパッドに保存し、 i アプリを終了させても記録が残っているようにします。
 
改良版のソースファイルは FrogClimberCanvas.java (リスト 1) になります。 実行するためには ADF (JAM ファイル) の SPsize キーに 32 と記述して下さい。 KToolbar を使用している場合は 「アプリケーション属性設定」ボタンから設定できます。
 

スクラッチパッド

 
スクラッチパッドは i モード対応 Java プロファイル固有の機能で、 画像や文字列などのデータを永続的に保存する領域です。 データの並びで構成されており、 Generic Connection フレームワークを使用してストリームを取得し、 そのストリームを通して読み書きを行うことが出来ます。
 
スクラッチパッドは 1 つの i アプリについて 最高 5KB までとの容量の制限があります。 この値は仕様上保証されている容量であり、 実際には 8/20 現在発売されている全ての機種が 10KB まで使用できます。 しかし、今後 5KB までしか使用できない機種が発売される 可能性がないとも言いきれないため、 使用する領域は 5KB までに抑えておくと良いです。
 
スクラッチパッドも Generic Connection フレームワークに基づいており、 プロトコルは「scratchpad」、位置は「///0」で固定です。 パラメータとして「;pos=アクセス個所」を追加することで、 スクラッチパッド上の読み書きを開始する位置を指定することもできます。 アクセス個所はスクラッチパッドの頭からのバイト数です。
 
Connector クラスの open(String name,int mode) クラスメソッドに 接続先「scratchpad:///0」と入出力モードを指定すると StreamConnection オブジェクトが得られます。 StreamConnection オブジェクトからは InputStream オブジェクトや OutputStream オブジェクトが取得できます。 スクラッチパッドから読み込みを行うのであれば、 入出力モードは Connector.READ として、 StreamConnection オブジェクトから openDataInputStream メソッドで DataInputStream オブジェクトを得ます (リスト 1 の load() メソッド)。 書き込みを行うのであれば、入出力モードは Connector.WRITE として、 StreamConnection オブジェクトから openDataOutputStream メソッドで DataOutputStream オブジェクトを得ます (リスト 1 の save() メソッド)。 ストリームを取得したら、以後は Java2SE と同様の方法で読み書きが出来ます。 ただし、java.io パッケージにあるストリームクラスの数は限られています。 使用後は close() メソッドで接続を終了します。
 
また、スクラッチパッドを使用する i アプリは ADF (JAM ファイル) の SPsize キーに使用する容量のバイト数を宣言しておく必要があります (例: SPsize=5120)。指定容量を越えた読み書きは出来ません。
 

リソース

 
実は画像・音声などのリソースの置き場所も Generic Connection フレームワークの接続先指定方法に 基づいていました (リスト 1 の 61 行目)。 MediaManager クラスで読み込むリソースのプロトコルに それぞれに応じた値を指定すれば画像をネットワーク先や スクラッチパッドから読み込むことも出来ます。
 

簡易接続用メソッド

 
Generic Connection フレームワークでストリームを取得するには、 Connector クラスから Connection オブジェクトを取得し、 さらにストリームを取得する方法が一般的です。 しかし、ストリームを取得する事だけが目的であれば、 Connector クラスにあるクラスメソッド openInputStream(String name)、 openOutputStream(String name) で接続先を指定して 直接ストリームを取得することもできます。
 
例えば、リスト 1 の load() メソッドは リスト 2 のように書き換えることも出来ます。
(リスト2 load() メソッド)
	private void load()
	{
		DataInputStream in;
	
		try {
			in=new DataInputStream(
			    Connector.openInputStream("scratchpad:///0"));
			hiscore=in.readInt();
			in.close();
		} catch (IOException e) {}
	}

[コラム] 旧SO503iのセキュリティ問題

 
SO503i(ソニー製)でセキュリティ上の不具合が見つかり、回収されました。 しかし、中には携帯電話の交換を行わない人もいると思います。 そのような方たちがセキュリティ問題に合ってしまわないために アプリケーション側でも対処しておいたほうがよいと思います。
 
そのセキュリティ問題とは i アプリをバージョンアップをした際に、 使用スクラッチパッドのサイズ (SPsize の値) が増えていると 他の i アプリのスクラッチパッドの読み書きができてしまう問題です。 i アプリのバージョンが上がった際に SPsize の値を増加させてしまうと、この問題にぶつかります。 そのため、バージョンアップをしてもスクラッチパッド使用サイズを 増やさないようにするか、増やした際には携帯電話の 「バージョンアップ機能」を使うのではなく 再ダウンロードするようにしてもらいましょう。

記録のランキング

次に、カエルがこれまでに飛んだ高さの最高値をネットワークに送り、 ランキングを競えるようにします。
 
改良版のソースファイルは FrogClimberCanvas.java (リスト 3) になります。 実行するためには ADF (JAM ファイル) の UseNetwork キーに http と記述して下さい。 KToolbar を使用している場合は 「アプリケーション属性設定」ボタンから設定できます。
 
またネットワークを使用するので、接続先となるサーバー (CGI や Servlet が実行できる環境) も用意します。 サーバー側はクエリーにスコア (カエルが飛んだ高さの最高値) を渡すと 順位を返すようになっていれば、何で書かれていてもかまいません。 ここでは一例として Perl プログラム ranking.cgi (リスト 4) を参考に示しておきます。 実行には書き込み権限のある空のテキストファイル record.dat も用意して下さい。
 

ネットワーク

 
ネットワーク接続も Generic Connection フレームワークに基づいており、 プロトコルは「http」となるため、接続先を URL とすれば接続できます。 接続先はセキュリティー保護のために i アプリのダウンロード元と同じサーバーのみに許されています。
 
ダウンロード元のサーバーのアドレスは IApplication オブジェクトの getSourceURL() メソッドで取得できるので、 接続先 URL はこのメソッドを使って作るようにすると良いです (リスト 3 の 278 行目)。また、今回は使用してはいませんが、 漢字や特殊な記号を含む URL を送信するときには com.nttdocomo.net.URLEncoder クラスを利用してエンコードが出来ます。
 
また、ネットワーク接続を使用する i アプリは ADF (JAM ファイル) の UseNetwork キーに http を指定する必要があります。 設定を行わないとネットワーク接続は出来ません。 携帯電話で実行する際に、ネットワークを使用するか否かを聞かれ、 拒否した場合もネットワーク接続はできません。
 
KToolbar を使った作業では i アプリをダウンロードして 実行しているのではないため、ダウンロード元が存在しません。 そのため、i アプリのダウンロード元の URL を指定して テストが出来るようになっています。 「編集」メニューの「設定」を選択し、「読み込み先 URL」に URL を入力します。 また、NetworkAccess を enable にします。 プロキシがある環境ではその設定も行います。 これで KToolbar でネットワークを使用した i アプリのテストが行えます。
 
ネットワーク接続の流れ (リスト 3) は以下のとおりです。 GET 型か POST 型、どちらの方法で接続するのかによって若干方法が異なります。
 
まず、Connector クラスの open(String name,int mode) クラスメソッドに 接続先 URL と入出力モードを指定すると com.nttdocomo.io.HttpConnection オブジェクトが得られます。 入出力モードは GET 型なら Connector.READ、 POST 型なら Connector.READ_WRITE とします (リスト 3 の 277 行目)。 続いて、HttpConnection オブジェクトに対して setRequestMethod(String method) メソッドで 接続方法を HttpConnection.GET または HttpConnection.POST で指定します (リスト 3 の 280 行目)。 さらに必要な情報を setRequestProperty(String key,String value) メソッドで設定します。 POST 型の接続の場合、Content-Type などが必要となります。 POST 型の接続の場合、openOutputStream メソッドで OutputStream オブジェクトを得て、 そのストリームに対してサーバーに引き渡す情報を書き込み、閉じます。 以上の準備を終えたら、connect() メソッドで 接続を開始します (リスト 3 の 281 行目)。 その後、HttpConnection オブジェクトから openInputStream メソッドで InputStream オブジェクトを得て、そのストリームでサーバーから 返された情報を取り出します (リスト 3 の 283〜287 行目)。 使用後は close() メソッドで接続を終了します (リスト 3 の 289 行目)。

終わりに

今回は Generic Connection フレームワークに基づいている ネットワークやスクラッチパッドへの接続方法について解説しました。
 
これで i モード対応 Java プロファイルの機能を一通り説明しました。 今回を持って、本連載は終了となります。 短い間でしたが、ご愛読ありがとうございました。

戻る