第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

    2024年04月26日 更新
    1. 楽天モバイルのスマホが乗っ取られる事案 同社が回線停止や楽天ID/パスワード変更などを呼びかけ (2024年04月23日)
    2. シャープ、5月8日にスマートフォンAQUOSの新製品を発表 (2024年04月24日)
    3. スマホを携帯キャリアで買うのは損? 本体のみをお得に買う方法を解説 (2024年04月24日)
    4. Vポイントの疑問に回答 Tポイントが使えなくなる? ID連携をしないとどうなる? (2024年04月23日)
    5. 通信品質で楽天モバイルの評価が急上昇 Opensignalのネットワーク体感調査で最多タイの1位 (2024年04月25日)
    6. 貼り付ければOK、配線不要の小型ドライブレコーダー発売 スマート感知センサーで自動録画 (2024年04月25日)
    7. ドコモ、「Xperia 10 V」を5万8850円に値下げ 「iPhone 15(128GB)」の4.4万円割引が復活 (2024年04月25日)
    8. 中古スマホが突然使えなくなる事象を解消できる? 総務省が「ネットワーク利用制限」を原則禁止する方向で調整 (2024年04月25日)
    9. スマートグラス「Rokid Max 2」発表 補正レンズなくても視度調節可能 タッチ操作のリモコン「Rokid Station 2」も (2024年04月25日)
    10. 「iPhone 15」シリーズの価格まとめ【2024年4月最新版】 ソフトバンクのiPhone 15(128GB)が“実質12円”、一括は楽天モバイルが最安 (2024年04月05日)
    最新トピックスPR

    過去記事カレンダー

    2024年