第7回 ネットワークiアプリのためのサーバサイド活用(2)90Xi専用ゲームiアプリ開発講座(3/4 ページ)

» 2004年11月29日 20時38分 公開
[澤橋辰典・武上将樹,ITmedia]

ゲーム終了

アプリからPOSTメソッドで送られる値

UTN=ser*********端末ID
ACTION=1状態フラグ(ゲーム終了)
RES=xx対戦結果フラグ

 対戦が終了すると、アプリは対戦結果をサーバに通知する。対戦に勝利した側のみが、サーバに結果を通知することができる。アプリからの通信を受けて、引分け時は双方がサーバにデータを通知することとなるが、先にデータを送ったほうの更新のみが反映され、後から送ったほうは無視する。システムエラーが発生しない限り、成功の値が戻される。アプリは値に従った表示を行う。

成功時…1

失敗時…0

アプリ側の重要な実装

 設計に関しての記憶が新しいうちに、アプリの実装も行っておこう。

 アプリからサーバサイドのシステムにデータを渡す場合には、POSTメソッドを用いてデータを送る。接続モードも読み書きが可能なモードにしておく。また、送信時のContent-Typeも、忘れずにapplication/x-www-form-urlencodedを指定しておこう。

 以下に、今回用意した接続と送信、受信のメソッドを示す。

 接続メソッドでは、スクリプトとの通信に、適切なリクエストを設定したHttpConnectionを返す。返されたオブジェクトを用いて接続と切断だけを行えばよい。

private static HttpConnection connectPost() {
 try {
    hc = (HttpConnection)Connector.open(
      IApp.getSourceURL() + "arena.php",
       Connector.READ_WRITE, true);
    hc.setRequestMethod(HttpConnection.POST);
    hc.setRequestProperty("Content-Type", "application/x-www-form-urlencoded");
    } catch (IOException e) {}
   return hc;
  }

 送信メソッドでは、引数に指定した文字列をスクリプトに送信する。

private static boolean sendPost(String sendData) {
 try {
 os = hc.openOutputStream();
   byte[] outdata = sendData.getBytes();
   os.write(outdata);
   System.out.println("sendData: "+sendData);
      os.close();
     return true;
   } catch (IOException e) {
     return false;
   }
 }

 受信メソッドでは、受信したデータをすべて読み取り、使用しやすいように、String型にして返している。

private static String receivePost() {
 try {
  is = hc.openInputStream();
  int isbuf;
  byte[] single = new byte[1];
  ByteArrayOutputStream baos = new ByteArrayOutputStream();
  for(;;) {
    if((isbuf = is.read(single)) < 0) {
   break;
    }
   baos.write(single);
  }
  is.close();
   return baos.toString();
 } catch (IOException e) {
  return null;
 }
}

 対戦相手を探すとき(マッチング時)に、サーバから送られてきたデータは不正なデータであれば"0"から始まっているので、その場合は例外を投げている。

if (strNet.startsWith("0")) {
 throw new Exception();
}

 正常なデータであれば、"1/"から始まっているので、3文字目以降から、次の"/"までを取得する。以下は敵プレイヤーの名前を取得し、URLデコードを行っている例である。

int start = 2, end = strNet.indexOf("/", 2);
nameE = strNet.substring(start, end);

Copyright © ITmedia, Inc. All Rights Reserved.

アクセストップ10

最新トピックスPR

過去記事カレンダー

2024年