|
原創(chuàng)作品,轉(zhuǎn)載請標明:http://blog.csdn.net/jackystudio/article/details/17347069
這里采用Apache+php搭建了一個簡易服務(wù)器,服務(wù)端用php語言,客戶端采用cocos2d-x的CCHttpClient類通過http方式訪問服務(wù)端資源。模擬了cocos2d-x提交賬戶和密碼到服務(wù)端,服務(wù)端校驗賬號密碼,如果正確返回客戶端成功登錄,如果錯誤則返回錯誤信息,同時在服務(wù)端后臺保存登錄log。第一次接觸php,語法上和C/C++還是蠻像的,主要是給出一個cocos2d-x網(wǎng)絡(luò)實例,代碼中并沒有做一些防呆糾錯措施。
1.搭建Apache+php網(wǎng)頁服務(wù)器
Apche2.2 x86版下載地址:http://pan.baidu.com/s/1vNuLF
php5.2.17版下載地址:http://pan.baidu.com/s/17sFoN
搭建過程參見http://tech.163.com/06/0206/11/299AMBLT0009159K.html,這里就不安裝MySQL了。
搭建成功后,打開http://127.0.0.1,就可以看到"It' works!"字樣。同時打開Apache monitor監(jiān)控Apache處于運行狀態(tài)。我這里使用的80端口。
2.php收集表單的方式
Http定義了與服務(wù)器交互的不同方法,最基本的方法有4種,分別是GET,POST,PUT,DELETE,對應(yīng)著查改增刪,這里介紹GET和POST。
用$_GET獲取表單數(shù)據(jù),表單數(shù)據(jù)對任何人都是可見的,比如
http://www.w3school.com.cn/welcome.php?username=jackystudio&password=123
用$_POST獲取表單數(shù)據(jù),表單數(shù)據(jù)則是不可見的,比如
http://www.w3school.com.cn/welcome.php
3.服務(wù)器php處理代碼
這里我直接修改了主頁index.html。會C++應(yīng)該都能看懂,先是打開一個log.txt,接收到username和password,如果是username是jackystudio,password是123的話,把username和password寫入log.txt,并返回登錄成功,如果username或password錯誤時返回登錄失敗。如果未接收到則返回沒有用戶名密碼。
3.1.采用get方式代碼
-
<html>
-
<body>
-
<?php
-
$open=fopen("log.txt","a" ); //Save password
-
if(isset($_GET["username"]) && isset($_GET["password"]))
-
{
-
if($_GET["username"]=="jackystudio" && $_GET["password"]=="123")
-
{
-
fwrite($open,"Username:".$_GET["username"]);
-
fwrite($open,"\r\n");
-
fwrite($open,"Password:".$_GET["password"]);
-
echo "Login Success"; //return to client
-
}
-
else
-
{
-
fwrite($open,"Wrong Username or password!");
-
echo "Login Failed"; //return to client
-
}
-
}
-
else
-
{
-
fwrite($open,"No password");
-
echo "No Username or Password"; //return to client
-
}
-
fclose($open);
-
?>
-
</body>
-
</html>
3.2.采用post方式代碼
-
<html>
-
<body>
-
<?php
-
$open=fopen("log.txt","a" ); //Save password
-
if(isset($_POST["username"]) && isset($_POST["password"]))
-
{
-
if($_POST["username"]=="jackystudio" && $_POST["password"]=="123")
-
{
-
fwrite($open,"Username:".$_POST["username"]);
-
fwrite($open,"\r\n");
-
fwrite($open,"Password:".$_POST["password"]);
-
echo "Login Success"; //return to client
-
}
-
else
-
{
-
fwrite($open,"Wrong Username or password!");
-
echo "Login Failed"; //return to client
-
}
-
}
-
else
-
{
-
fwrite($open,"No password");
-
echo "No Username or Password"; //return to client
-
}
-
fclose($open);
-
?>
-
</body>
-
</html>
4.cocos2d-x使用CCHttpClient類進行網(wǎng)絡(luò)請求
CCHttpClient的使用這里也不贅述了,請移步官方文檔How_to_use_CCHttpClient。這里在上文編輯框和點九圖的基礎(chǔ)上進行了修改。2個編輯框,分別是username和password。一個按鈕點擊發(fā)送請求。一個文本顯示從服務(wù)器返回的結(jié)果。
4.1.按鈕請求處理
-
void TestLayer::btncallback( CCObject* pSender )
-
{
-
bool requestType_is_get=true;//采用get方式或者post方式
-
if (requestType_is_get)
-
{
-
CCHttpRequest* request = new CCHttpRequest();//創(chuàng)建請求對象
-
string str1 = "127.0.0.1:80/index.html?";
-
string str2 = p_User_EditBox->getText();//獲取username編輯框內(nèi)容
-
string str3 = p_Psw_EditBox->getText();//獲取password編輯框內(nèi)容
-
string struser="username=";
-
string strpsw="&password=";
-
str1=str1+struser+str2+strpsw+str3;
-
request->setUrl(str1.c_str());//設(shè)置請求的url,username和password已經(jīng)包含在url中
-
request->setRequestType(CCHttpRequest::kHttpGet);//設(shè)置為Get模式
-
request->setResponseCallback(this, httpresponse_selector(TestLayer::onHttpRequestCompleted));//設(shè)置響應(yīng)的回調(diào)
-
request->setTag("GET test");
-
CCHttpClient::getInstance()->send(request);//發(fā)送請求
-
request->release();//釋放請求
-
}
-
else
-
{
-
CCHttpRequest* request = new CCHttpRequest();//創(chuàng)建請求對象
-
string str1 = "127.0.0.1:80/index.html";
-
string str2 = p_User_EditBox->getText();
-
string str3 = p_Psw_EditBox->getText();
-
string struser="username=";
-
string strpsw="&password=";
-
str2=struser+str2+strpsw+str3;
-
-
request->setUrl(str1.c_str());//設(shè)置請求的url,只是請求頁面的url,并不包含username和password
-
request->setRequestType(CCHttpRequest::kHttpPost);//設(shè)置為Post模式
-
request->setResponseCallback(this, httpresponse_selector(TestLayer::onHttpRequestCompleted));//設(shè)置響應(yīng)的回調(diào)
-
-
const char* postData = str2.c_str();
-
request->setRequestData(postData, strlen(postData));//設(shè)置請求數(shù)據(jù),也就是username和password
-
-
request->setTag("POST test");
-
CCHttpClient::getInstance()->send(request);//發(fā)送請求
-
request->release();//釋放請求
-
}
-
}
4.2.響應(yīng)回調(diào)處理
-
void TestLayer::onHttpRequestCompleted( CCHttpClient* client, CCHttpResponse* response )
-
{
-
if (!response->isSucceed())//如果響應(yīng)失敗,輸出錯誤信息
-
{
-
CCString strError;
-
strError.initWithFormat("Receive Error! \n%s\n",response->getErrorBuffer());
-
m_labelStatusCode->setString(strError.getCString());
-
return ;
-
}
-
-
std::vector<char> *buffer = response->getResponseData();//接收響應(yīng)信息
-
string recieveData;
-
for (unsigned int i = 0; i < buffer->size(); i++)
-
{
-
recieveData += (*buffer)[i];
-
}
-
size_t begin= recieveData.find("<body>")+6;//這里簡單處理,獲取<body>標簽內(nèi)數(shù)據(jù),即是響應(yīng)內(nèi)容
-
size_t end= recieveData.find("</body>");
-
string result(recieveData,begin,end-begin);
-
m_labelStatusCode->setString(result.c_str());
-
}
5.效果圖
5.1.Apache運行(Get和Post兩種效果都是一樣的)
(1)賬號密碼正確時

(2)賬號密碼錯誤時

5.2.關(guān)閉Apache

6.源碼下載
下載地址:http://download.csdn.net/detail/jackyvincefu/6713471
|