XMLHTTPRequest Login

XMLHTTPRequest でプレイヤーのログインを知らせます。
Login id=AA
Login id=BB

xml_login.php を呼び出すコードです。
<a href="http://maedakobe.rw.xsi.jp/php/xml_login.php?id=AA" target="_blank">Login id=AA</a><br>
<a href="http://maedakobe.rw.xsi.jp/php/xml_login.php?id=BB" target="_blank">Login id=BB</a><br>

XMLHTTPRequest の概要

  1. XMLHTTPRequest を使ってゲームの対戦相手がログインしたことを知らせます。
    XMLHTTPRequest の基本は Using the XMLHttpRequest Object を参照して下さい。
  2. サーバー上に test.txt を置いてログイン情報を管理します。
    ファイルは上書きするので何が書かれていても構わないので、書き込みと読み込み属性を許可して下さい。
    名前 説明
    $id_a プレイヤーAのID
    $id_b プレイヤーBのID(初期値は'-')
  3. プログラムテストの手順です。
    1. プレイヤーAが id=AA でログインします。
      test.txt がプレイヤーAがログインした状態に設定(初期化)されます。
    2. プレイヤーBがログインするまで待ち合せます。
    3. プレイヤーBが別のネット環境からホームページを立ち上げます。
      (1台のパソコンで別のホームページを立ち上げてテストすることも出来ます)
    4. プレイヤーBが id=BB でログインします。
    5. プレイヤーAにプレイヤーBがログインしたことを知らせます。
      今回のプログラムはゲームが開始出来る状態になると終了です。

xml_login.php の説明

  1. プレイヤーがログインする xml_login.php です。
    Shift_JIS でタイプしてアップロードして下さい。
    <script type="text/javascript">
    function loadXMLDoc()
    {   var xhttp = new XMLHttpRequest();
        xhttp.onreadystatechange = function()
        {   if (this.readyState == 4 && this.status == 200)
            {   document.write(this.responseText);
            }
        };
        xhttp.open("GET", "login_check.php", true);
        xhttp.send();
    }
    </script>
    
    <?php
    // test.txt に書き込む
    function  put()
    {   global $id_a, $id_b;
        if (!($fp = fopen("test.txt","w")))
        {   die("Text File Not Found");  }
        flock($fp,LOCK_EX);
        fputs($fp,"$id_a\r\n"); 
        fputs($fp,"$id_b\r\n"); 
        flock($fp,LOCK_UN);
        fclose($fp);
    }
    
        $id_a= 'AA';
        $id_b= '-';
        $id= $_GET['id'];
        if ($id=='AA')
        {   put();
            print("対戦相手を待ちます<br>\n");
            print("<script type='text/javascript'>\n");
            print("loadXMLDoc()");
            print("</script>\n");
        }
        if ($id=='BB')
        {   $id_b= 'BB';
            put();
        }
    ?>
    
  2. javascript の loadXMLDoc() 関数で対戦相手がログインしたことを調べます。
    "login_check.php" が test.txt を入力して、プレイヤーAとプレイヤーBのログインを調べる関数です。
        xhttp.open("GET", "login_check.php", true);
        xhttp.send();
    
  3. put() 関数は $id_a, $id_b の値を test.txt を書き込む関数です。
  4. プログラムの実行が開始されるのはここからです。
    パラメータで渡された id を受け取ります。
    'AA' のときは test.txt をプレイヤーAがログインした状態に設定(初期化)します。
    メッセージを表示して対戦相手を待ちます。
    loadXMLDoc() は javascript の関数なので "<script type='text/javascript'> と "</script> で囲って下さい。
        $id_a= 'AA';
        $id_b= '-';
        $id= $_GET['id'];
        if ($id=='AA')
        {   put();
            print("対戦相手を待ちます<br>\n");
            print("<script type='text/javascript'>\n");
            print("loadXMLDoc()");
            print("</script>\n");
        }
    
  5. 'BB' のときは $id_b に 'BB' を設定して test.txt に書き込みます。
    'AA' と 'BB' が書き込まれると対戦相手がそろいます。
        if ($id=='BB')
        {   $id_b= 'BB';
            put();
        }
    

login_check.php の説明

  1. loadXMLDoc() 関数から呼ばれるプレイヤーのログインを調べるプログラムです。
    Shift_JIS でタイプしてアップロードして下さい。
    <?php
    function  get()
    {   global $id_a, $id_b;
        if (!($fp = fopen("test.txt","r")))
        {   die("Text File Open Error");  }
        $id_a   = fgets($fp);
        $id_b   = fgets($fp);
        $id_a   = str_replace(array("\r", "\n"), '', $id_a);
        $id_b   = str_replace(array("\r", "\n"), '', $id_b);
        fclose($fp);
    }
        $id_a= '-';
        $id_b= '-';
        while(1)
        {   get();
            if ($id_a!='-' && $id_b!='-')   break;
            usleep(1000);
        }
        print "It is ready!";   
    ?>
    
  2. get() 関数は test.txt を入力して $id_a, $id_b に格納する関数です。
  3. 1000 ミリ秒ごとに get() 関数を実行して $id_a と $id_b が設定されるのを待ち合せます。
    設定されると(二人のプレイヤーがログイン) print "It is ready!"; を実行します。
    この値が loadXMLDoc() の this.responseText として返されます。
        while(1)
        {   get();
            if ($id_a!='-' && $id_b!='-')   break;
            usleep(1000);
        }
        print "It is ready!";   
    ?>
    

前田稔の超初心者のプログラム入門
PHP Program