第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年09月19日 更新
    1. 出そろった「iPhone 18 Pro」の価格を4キャリアで比較 ソフトバンクが衝撃の安さ、楽天モバイルが異例の施策 (2026年09月13日)
    2. IIJに聞く“eSIMサポート”の裏側 「つながらない」「消した」なぜ起こる? 現場が打つ次の一手 (2026年09月18日)
    3. 「iPhone 18 Pro」は何が進化した? 「iPhone 17/17 Pro」とスペックを比較 全て20万円超えの価格が悩ましい (2026年09月10日)
    4. iPhone Duoを「開いたままでも片手で持てる」ケース登場 ESRが新製品発表、日本で急成長の理由とは (2026年09月17日)
    5. Androidでおサイフケータイを使いたくない理由 初期化で消えないデータと売却時の落とし穴 (2026年09月19日)
    6. 「Suicaのペンギン」卒業騒動にまつわる背景と誤解 JR東日本に聞いた (2025年11月14日)
    7. 15日配信「iOS 27」の新機能まとめ Siri AIの恩恵を受けられる機種は? 画像編集やSafariにも注目 (2026年09月14日)
    8. JR東日本「分かりにくい」新幹線券売機を改善へ なぜ、スマホではなく「駅での最短1分購入」を実現? (2026年07月04日)
    9. ドコモのiPhone、iOS 27でRCSに対応 3キャリアのiPhoneとAndroidで利用可能に (2026年09月17日)
    10. フォルダブル歴5年の筆者も驚いた「iPhone Duo」の完成度 ソフトウェアの力で再定義できるか (2026年09月19日)
    最新トピックスPR

    過去記事カレンダー