Mobile:NEWS 2002年9月13日 10:13 PM 更新

ビジネスiアプリ入門(5)
待ち受けビジネスIMのクライアント(iアプリ)の作成(1/4)

今回は、クライアント/サーバ型のシステムである待ち受けビジネスIMの、クライアント部となるiアプリを作成する

 今回からいよいよ、実際のコーディングに入ります。待ち受けビジネスIMは、クライアントとサーバから構成されますが、今回はクライアント側のiアプリを作成します。

大まかな設計とデータ構造

 iアプリの処理を画面別に整理し、図にしてみます。


ビジネスIM iアプリの画面

 初回登録ではIMメンバーとして自分の名前を登録するようにします。この図を元に、iアプリで行うべき機能と使用する具体的なデータを挙げてみます。

初期登録自分の名前を登録する
メンバーの状態表示メンバーの名前と状態を表示
状態・メッセージの受信メンバーの名前と状態、またはメッセージを受け取る
メッセージ送信自分の名前と相手の名前でサーバに送る
自分の状態変更自分の名前と状態をサーバに送る

 これらより以下のようなデータ構造が見えてきます。
意味持続期間変更
自分の名前1つずっと保持するなし
メンバー(名前と状態)メンバーの数だけずっと保持するあり
メッセージ(名前とメッセージ)メッセージの数だけ来たときに使用するのみ
データ構造

 これをiアプリで使用できるようにJavaで記述します。上記のデータ構造で持続期間が永久であるものを、後述のデータの永続化のために、Dataクラスとしてひとまとめにすることにします。

 static class Data { // ビジネスIMで使用するデータを保持するクラス
  String myname = null;
  Vector member = new Vector();
 }
 static class Member { // メンバー1人の情報を保持するクラス
  String name;
  String state;
 }
 class Message { // メッセージ1つを保持するクラス
  String name;
  String message;
 }

 Vector(java.util.Vector)は、追加や削除が可能な動的にサイズの変わる配列のように用いるデータ保持クラスです。

データの永続化

 作成したデータ構造は、待ち受けiアプリ内で保持していたとしても、ほかのiアプリの起動などによりいったん終了すると消えてしまいます。そのため端末のスクラッチパッドに保存しておく(永続化する)必要があります。

 永続化のためには、Connectorによってスクラッチパッドにアクセスするようにします。

 // ------------------------------------------------------------------
 // データの永続化
 // ------------------------------------------------------------------
 
 final int SP_DATA_POS = 0;
 void writeData(Data data) {
  try {
   OutputStream os = Connector.openOutputStream("scratchpad:///0;pos=" + SP_DATA_POS);
   writeString(os, data.myname);
   os.write(data.member.size());
   for (int i = 0; i < data.member.size(); i++) {
    Member member = (Member)data.member.elementAt(i);
    writeString(os, member.name);
    writeString(os, member.state);
   }
  } catch (Exception e) {
  }
 }
 Data readData() {
  InputStream is = null;
  try {
   is = Connector.openInputStream("scratchpad:///0;pos=" + SP_DATA_POS);
   
   Data data = new Data();
   data.myname = readString(is);
   if (data.myname == null)
    return null;
   int n = is.read();
   for (int i = 0; i < n; i++) {
    Member member = new Member(readString(is), readString(is));
    data.member.addElement(member);
   }
   is.close();
   return data;
  } catch (Exception e) {
   try {
    if (is != null)
     is.close();
   } catch (Exception e2) {
   }
  }
  return null; // エラー時にはnullを返す
 }
 readDataにおいて何もデータが書かれていない場合、nullを返し、初回登録させるようにしています。また、上記コードにある、文字列を入出力するメソッドwriteString/readStringは以下のような実装となります。

 void writeString(OutputStream os, String s) throws Exception {
  os.write(s.length());
  os.write(s.getBytes());
 }
 String readString(InputStream is) throws Exception {
  int len = is.read();
  if (len == 0)
   return null;
  byte[] b = new byte[len];
  int off = 0;
  for (;;) {
   int n = is.read(b, off, len);
   if (n < 0)
    return null;
   off += n;
   len -= n;
   if (len == 0)
    break;
  }
  return new String(b);
 }

 readString内のbyte配列の読み込みメソッド is.read は、指定した長さだけ読み込むことが保証されておらず、読み込んだ長さを返すため、このように少し長めのコードになってしまいます。

[福野泰介, ITmedia]

Copyright © ITmedia, Inc. All Rights Reserved.

前のページ | 1/4 | 次のページ



モバイルショップ

最新スペック搭載ゲームパソコン
高性能でゲームが快適なのは
ドスパラゲームパソコンガレリア!

最新CPU搭載パソコンはドスパラで!!
第3世代インテルCoreプロセッサー搭載PC ドスパラはスピード出荷でお届けします!!