第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年04月13日 更新
    1. もうiPhoneユーザーの「エアドロで送るね」に苦しまない? Google Japanが「共有の扉を開くことが叶わず」などと“おわび”したワケ (2026年04月11日)
    2. 紛失した「AirPods Pro 3」片耳をAppleで購入したハナシ そしてまさかの結末に (2026年04月11日)
    3. 「Google Pixel 10a」レビュー:aシリーズらしい取捨選択のうまさが光る Pixel 9aとの差分をどう考えるかがカギ (2026年04月13日)
    4. 廉価モデル「Pixel 10a」「iPhone 17e」を比較 価格とスペックに“決定的な差”あり (2026年04月10日)
    5. ソフトバンクが「今回もやる」とGalaxy S26を月額1円で販売――販売方法を早急に見直さないと撤退を迫られるメーカーも (2026年03月08日)
    6. フェラーリデザインをスマホに! Infinixから美しすぎるスマホ登場 (2026年04月12日)
    7. ソフトバンク値上げの背景に「通信品質維持の限界点」 Y!mobileは収益重視で改定、LINEMOは据え置き (2026年04月10日)
    8. あなたの街の「スマホ決済」キャンペーンまとめ【2026年4月版】〜PayPay、d払い、au PAY、楽天ペイ (2026年04月10日)
    9. 「ダイソン初のハンディファン」発表 “同社のエンジニアリング”を凝縮 USB Type-Cに対応 (2026年04月11日)
    10. コンセントプラグに「見守り機能」を持たせるという発想はなかったが合理的 (2026年04月11日)
    最新トピックスPR

    過去記事カレンダー

    2026年