UnityからサーバへHTTPリクエストを送り、レスポンスを受け取る

オンラインランキングや、更新するコンテンツなど
データをサーバで管理したいときがあります。

HTTPを使用した、Unity⇔サーバ間の簡単な通信プログラムを記述します。

※GET、POST、タイムアウトに対応
※サーバプログラムはPHPを使用しています

参考URL
WWWクラスのタイムアウト処理


Unity(クライアント)の処理

using UnityEngine;
using System;
using System.Collections;
using System.Collections.Generic;

public class HttpRequestManager : MonoBehaviour {
// URL
string url = "http://111.111.111.111/server.php";
// サーバへリクエストするデータ
string user_id = "0";
string user_name = "matudozer";
string user_data = "xx,yy,zz";
// タイムアウト時間
float timeoutsec = 5f;

void Start() {
// サーバへPOSTするデータを設定
Dictionary<string, string> dic = new Dictionary<string, string>();
dic.Add ("id", user_id);
dic.Add ("name", user_name);
dic.Add ("data", user_data);
StartCoroutine(HttpPost(url, dic)); // POST

// サーバへGETするデータを設定
string get_param = "?id=" + user_id + "&name=" + user_name + "&data=" + user_data;
StartCoroutine(HttpGet(url + get_param)); // GET
}

// HTTP POST リクエスト
IEnumerator HttpPost(string url, Dictionary<string, string> post)
{
WWWForm form = new WWWForm();
foreach(KeyValuePair<String, String> post_arg in post) {
form.AddField(post_arg.Key, post_arg.Value);
}
WWW www = new WWW(url, form);

// CheckTimeOut()の終了を待つ。5秒を過ぎればタイムアウト
yield return StartCoroutine(CheckTimeOut(www, timeoutsec));

if (www.error != null) {
Debug.Log("HttpPost NG: " + www.error);
}
else if (www.isDone) {
// サーバからのレスポンスを表示
Debug.Log("HttpPost OK: " + www.text);
}
}

// HTTP GET リクエスト
IEnumerator HttpGet(string url)
{
WWW www = new WWW(url);

// CheckTimeOut()の終了を待つ。5秒を過ぎればタイムアウト
yield return StartCoroutine(CheckTimeOut(www, timeoutsec));

if (www.error != null) {
Debug.Log("HttpGet NG: " + www.error);
}
else if (www.isDone) {
// サーバからのレスポンスを表示
Debug.Log("HttpGet OK: " + www.text);
}
}

// HTTPリクエストのタイムアウト処理
IEnumerator CheckTimeOut(WWW www, float timeout)
{
float requestTime = Time.time;

while(!www.isDone)
{
if(Time.time - requestTime < timeout)
yield return null;
else
{
Debug.Log("TimeOut"); //タイムアウト
break;
}
}
yield return null;
}
}
※コルーチンの中でコルーチンを「yield return StartCoroutine()」の形で呼び出すと、処理が終わるのを待ちます

PHP(サーバ)の処理
<?php

// POSTかGETか?
if ($_SERVER['REQUEST_METHOD'] == "POST") {

// UnityからPOSTされたデータを受け取る
$id = $_POST["id"];
$name = $_POST["name"];
$data = $_POST["data"];
}
else {
// UnityからGETされたデータを受け取る
$id = $_GET["id"];
$name = $_GET["name"];
$data = $_GET["data"];
}

// Unityへのレスポンスを設定
$res = "Unityから受け取ったデータ:" . " id=" . $id . " name=" . $name . " data=" . $data;

echo $res;

?>
※サーバからUnityにレスポンスを送る場合は、「echo」を使用します

(実行例 Unityのコンソールログ)
Unity⇔サーバ間の通信プログラム

関連記事
[タグ] ネットワーク

コメント

非公開コメント

上記広告は1ヶ月以上更新のないブログに表示されています。新しい記事を書くことで広告を消せます。