第8回 90xiアプリのこれから90Xi専用ゲームiアプリ開発講座(1/2 ページ)

» 2004年12月08日 02時02分 公開
[澤橋辰典・武上将樹,ITmedia]

  • 第8回 90xiアプリのこれから
  • 第7回 ネットワークiアプリのためのサーバサイド活用(2)
  • 第6回 ネットワークiアプリのためのサーバサイド活用(1)
  • 第5回  スクラッチパッドへのデータ保存とダウンロードファイルの処理
  • 第4回 カメラ機能を使ってカードを作ろう
  • 第3回 簡単なゲーム作成の流れを身に付ける
  • 第2回 カードゲームをつくってみよう
  • 第1回 90xiの時代に何を作るか
  •  前回まで、90xiで動作するネットワーク対応のカードゲームの作り方を紹介してきた。最終回はこのアプリをもっと展開させていくための手法と、90xiアプリのこれからについて解説しよう。

    赤外線通信

     赤外線通信を使えば通信費をかけずにデータのやり取りができる。これを用いれば、カードゲームへの応用として、ユーザ間でのカード交換を実現できる。

     赤外線通信のモデルは、サーバ/クライアントモデルとなっている。サーバが待機状態になっている時にクライアントがデータを送信したり、また、データを要求して受信したりすることができる。サーバとクライアントはセットで使用しなければならないので、両方のサンプルを紹介する。HTTP通信と似ているため、理解しやすいだろう。

     以下がクライアントのプログラムである。

    // 受信/送信するカード番号
    int card_recv, card_send;
    // ClientObexConnectionオブジェクトを用意
    ClientObexConnection coc;
    try {
        // HTTPの接続と同様にConnector.open()を用いる
        // URLの代わりに、クライアントの場合はロケーションに
        // "obex:/irclient"を指定する。
        coc = (ClientObexConnection) Connector.open("obex:/irclient",
                Connector.READ_WRITE, true);
        // 接続を行う
        coc.connect();
        // GETオペレーションの実行
        coc.setOperation(ObexConnection.GET);
        coc.setName("card_recv"); // GET 対象オブジェクトの名前を設定
        coc.sendRequest(); // オペレーションを送信
        // OBEX サーバから返却されたレスポンスコードをチェックし、
        // 正常であれば受信したオブジェクト本体を読み込む
        if (coc.getResponseCode() == ObexConnection.SUCCESS) {
            InputStream is = coc.openInputStream();
            // GETオペレーションで要求したデータの読み込み処理
            int isbuf;
            byte[] single = new byte[1];
            ByteArrayOutputStream baos =
     new ByteArrayOutputStream();
            for(;;) {
                if((isbuf = is.read(single)) < 0) {
                    break;
                }
                baos.write(single);
            }
            is.close();
            card_recv = Integer.parseInt
    (baos.toString());
            in.close();
        } else {
            throw new IOException();
        }
        // PUTオペレーションの実行
        coc.setOperation(ObexConnection.PUT); // オペレーションにPUTを設定
        coc.setName("card_send");  // PUT 対象オブジェクトの名前を設定
        coc.setType("text/plain"); // PUT 対象オブジェクトのタイプを設定
        coc.setTime(System.currentTimeMillis()); // PUT 対象オブジェクトの
         // タイムスタンプを設定
        OutputStream os = coc.openOutputStream();
        // PUTオペレーションで送信するデータの書き込み処理
        os.write((byte)card_send);
        os.close();
        coc.sendRequest(); // オペレーションを送信
        // レスポンスコードが正常であればClientObexConnection を閉じて処理終了
        if (coc.getResponseCode() != ObexConnection.SUCCESS) {
            throw new IOException();
        }
        coc.close();
    } catch (IOException ioe) {
        //例外処理
        //API がスローするIOException、ConnectionException、
        //アプリケーションプログラムがスローするIOException の処理を行う
    }

     以下がサーバのプログラムである。

    int server_recv, server_send;
    // ServerObexConnectionオブジェクトを用意
    ServerObexConnection soc;
    try {
        // ServerObexConnection インスタンスを取得する
        // サーバの場合のロケーションは、"obex:/irserver"
        soc = (ServerObexConnection) Connector.open(
                "obex:/irserver", Connector.READ_WRITE, true);
        // OBEX クライアントからの通信リンク確立要求を待ち合わせる
        soc.accept();
        // OBEX クライアントからのオペレーション要求を処理する
        while (true) {
            // オペレーション要求を待つ
            soc.receiveRequest();
            // 到着したオペレーションの種別を取得する
            int operation = soc.getOperation();
            // GET オペレーション要求
            if (operation == ObexConnection.GET) {
                // 要求されたオブジェクトの名前を取得
                String name = soc.getName();
                // 指定された名前に対応するオブジェクトのヘッダ情報を設定
                soc.setType("text/plain");
                soc.setTime(System.currentTimeMillis());
                // 指定された名前に対応するオブジェクトの書き込み処理
                OutputStream os = soc.openOutputStream();
                if (name.equals("card_recv")) {
                    os.write((byte)server_send);
                }
                os.close();
                // 正常終了を示すステータスコードをOBEXクライアントに返す
                soc.sendResponse(ObexConnection.SUCCESS);
            } else if (operation == ObexConnection.PUT) {
                // PUTオペレーション要求
                // 送信されたオブジェクトの各種情報を取得
                String name = soc.getName();
                String type = soc.getType();
                long time = soc.getTime();
                // 送信されたオブジェクトの読み出し処理
                InputStream is = soc.openInputStream();
                if (name.equals("card_send")) {
                    int isbuf;
                    byte[] single = new byte[1];
                    ByteArrayOutputStream baos =
     new ByteArrayOutputStream();
                    for(;;) {
                        if((isbuf = is.read(single)) < 0) {
                            break;
                        }
                        baos.write(single);
                    }
                    is.close();
                    server_recv = Integer.parseInt
    (baos.toString());
                }
                is.close();
                // 正常終了を示すステータスコードをOBEXクライアントに返す
                soc.sendResponse(ObexConnection.SUCCESS);
            } else if (operation ==
     ObexConnection.DISCONNECT) { // 切断要求
                break;
            }
        }
        // 通信リンクを切断し、通信を終了する
        soc.close();
    } catch (IOException ioe) {
        // 例外処理
        // API がスローするIOException、ConnectionException の処理を行う
    }

     これで、下記のようなカードの交換を実現することができた。

    card_send → server_recv
    server_send → card_recv

           1|2 次のページへ

    Copyright © ITmedia, Inc. All Rights Reserved.

    アクセストップ10

    2026年07月21日 更新
    1. ダイソーで330円の「人感・明暗センサーLEDバーライト(Type-C)」が意外と便利 1人暮らしの帰宅時や非常灯に便利  (2026年07月18日)
    2. なぜ「060」携帯番号は18カ月あっても延期になったのか? それでも「慌てる必要はない」現状 (2026年07月20日)
    3. 専用充電器はもう不要? 中韓スマホから国内勢まで巻き込む「USB PPS」急速充電の新常識 (2026年07月14日)
    4. 「Pixel 11」は何が変わる? メモリ減少で100ドル前後の値上げも? 出そろったうわさを整理する (2026年07月19日)
    5. JR東日本「分かりにくい」新幹線券売機を改善へ なぜ、スマホではなく「駅での最短1分購入」を実現? (2026年07月04日)
    6. ショップとAIで差別化を図る「ドコモの銀行」――住信SBIネット銀行ユーザーからは戸惑いも (2026年07月19日)
    7. 携帯番号に「060」が採用されるワケ 「電話番号とは何か」を歴史とともに振り返る (2024年10月09日)
    8. iPhoneやApple Watch一斉値上げ 17無印は14万2800円に、17eは10万円超え 加速する中古スマホ特需 (2026年07月18日)
    9. “特典終了”が続く「d払い」「dポイント」のお得さはどう変わるのか これからは「dカード」の利用が得策? (2026年07月17日)
    10. ミドルハイレンジモデルにも水冷搭載 nubiaから「Neo 5 GT Special Edition」登場 (2026年07月19日)
    最新トピックスPR

    過去記事カレンダー