【玩转cocos2d-x之三十一】弱联网与服务器的通讯

前端之家收集整理的这篇文章主要介绍了【玩转cocos2d-x之三十一】弱联网与服务器的通讯前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

原创作品,转载请标明http://www.jb51.cc/article/p-ndohzuqc-ep.html


这里采用Apache+PHP搭建了一个简易服务器,服务端用PHP语言,客户端采用cocos2d-x的CCHttpClient类通过http方式访问服务端资源。模拟了cocos2d-x提交账户和密码到服务端,服务端校验帐号密码,如果正确返回客户端成功登录,如果错误则返回错误信息,同时在服务端后台保存登录log。第一次接触PHP,语法上和C/C++还是蛮像的,主要是给出一个cocos2d-x网络实例,代码中并没有做一些防呆纠错措施。


1.搭建Apache+PHP网页服务器

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监控Apache处于运行状态。我这里使用的80端口。


2.PHP收集表单的方式

Http定义了与服务器交互的不同方法,最基本的方法有4种,分别是GET,POST,PUT,DELETE,对应着查改增删,这里介绍GET和POST。

用$_GET获取表单数据,表单数据对任何人都是可见的,比如

http://www.w3school.com.cn/welcome.PHP?username=jackystudio&password=123

用$_POST获取表单数据,表单数据则是不可见的,比如
http://www.w3school.com.cn/welcome.PHP


3.服务器PHP处理代码


这里我直接修改了主页index.html。会C++应该都能看懂,先是打开一个log.txt,接收到username和password,如果是username是jackystudio,password是123的话,把username和password写入log.txt,并返回登录成功,如果username或password错误时返回登录失败。如果未接收到则返回没有用户名密码。

3.1.采用get方式代码

  1. <html>@H_403_126@
  2. <body>@H_403_126@
  3. <?PHP@H_403_126@
  4. $open=fopen("log.txt","a");//Savepassword@H_403_126@
  5. if(isset($_GET["username"])&&isset($_GET["password"]))@H_403_126@
  6. {@H_403_126@
  7. if($_GET["username"]=="jackystudio"&&$_GET["password"]=="123")@H_403_126@
  8. fwrite($open,"Username:".$_GET["username"]);@H_403_126@
  9. fwrite("\r\n");@H_403_126@
  10. "Password:".$_GET["password"]);@H_403_126@
  11. echo"LoginSuccess";//returntoclient@H_403_126@
  12. }@H_403_126@
  13. else@H_403_126@
  14. {@H_403_126@
  15. "WrongUsernameorpassword!");@H_403_126@
  16. echo"LoginFailed";//returntoclient@H_403_126@
  17. }@H_403_126@
  18. "Nopassword");@H_403_126@
  19. echo"NoUsernameorPassword"; fclose($open);@H_403_126@
  20. ?>@H_403_126@
  21. </body>@H_403_126@
  22. </html>@H_403_126@

3.2.采用post方式代码

  1. <html>@H_403_126@
  2. <body>@H_403_126@
  3. <?PHP@H_403_126@
  4. //Savepassword@H_403_126@ @H_144_403@$_POST["username"])&&isset($_POST["password"]))@H_403_126@
  5. {@H_403_126@ @H_144_403@$_POST["username"]=="jackystudio"&&$_POST["password"]=="123")@H_403_126@
  6. $_POST["username"]);@H_403_126@
  7. "\r\n");@H_403_126@ @H_144_403@$_POST["password"]);@H_403_126@
  8. //returntoclient@H_403_126@
  9. }@H_403_126@
  10. else@H_403_126@
  11. {@H_403_126@
  12. "WrongUsernameorpassword!");@H_403_126@ @H_144_403@//returntoclient@H_403_126@
  13. }@H_403_126@
  14. "Nopassword");@H_403_126@ @H_144_403@$open);@H_403_126@
  15. ?>@H_403_126@
  16. </body>@H_403_126@
  17. </html>@H_403_126@

4.cocos2d-x使用CCHttpClient类进行网络请求

CCHttpClient的使用这里也不赘述了,请移步官方文档How_to_use_CCHttpClient。这里在上文编辑框和点九图的基础上进行了修改。2个编辑框,分别是username和password。一个按钮点击发送请求。一个文本显示从服务器返回的结果。


4.1.按钮请求处理

[cpp] copy
    voidTestLayer::btncallback(CCObject*pSender)@H_403_126@
  1. boolrequestType_is_get=true;//采用get方式或者post方式@H_403_126@
  2. if(requestType_is_get)@H_403_126@
  3. CCHttpRequest*request=newCCHttpRequest();//创建请求对象@H_403_126@
  4. stringstr1="127.0.0.1:80/index.html?";@H_403_126@
  5. stringstr2=p_User_EditBox->getText();//获取username编辑框内容@H_403_126@
  6. stringstr3=p_Psw_EditBox->getText();//获取password编辑框内容@H_403_126@
  7. stringstruser="username=";@H_403_126@
  8. stringstrpsw="&password=";@H_403_126@
  9. str1=str1+struser+str2+strpsw+str3;@H_403_126@
  10. request->setUrl(str1.c_str());//设置请求的url,username和password已经包含在url中@H_403_126@
  11. request->setRequestType(CCHttpRequest::kHttpGet);//设置为Get模式@H_403_126@
  12. request->setResponseCallback(this,httpresponse_selector(TestLayer::onHttpRequestCompleted));//设置响应的回调@H_403_126@
  13. request->setTag("GETtest");@H_403_126@
  14. CCHttpClient::getInstance()->send(request);//发送请求@H_403_126@
  15. request->release();//释放请求@H_403_126@
  16. stringstr1="127.0.0.1:80/index.html";@H_403_126@
  17. stringstr2=p_User_EditBox->getText();@H_403_126@
  18. stringstr3=p_Psw_EditBox->getText();@H_403_126@
  19. str2=struser+str2+strpsw+str3;@H_403_126@
  20. @H_403_126@
  21. request->setUrl(str1.c_str());//设置请求的url,只是请求页面的url,并不包含username和password@H_403_126@
  22. request->setRequestType(CCHttpRequest::kHttpPost);//设置为Post模式@H_403_126@
  23. request->setResponseCallback(//设置响应的回调@H_403_126@
  24. constchar*postData=str2.c_str();@H_403_126@
  25. request->setRequestData(postData,strlen(postData));//设置请求数据,也就是username和password@H_403_126@
  26. @H_403_126@
  27. request->setTag("POSTtest");@H_403_126@
  28. CCHttpClient::getInstance()->send(request);//发送请求@H_403_126@
  29. request->release();//释放请求@H_403_126@
  30. }@H_403_126@

4.2.响应回调处理

copy
    voidTestLayer::onHttpRequestCompleted(CCHttpClient*client,CCHttpResponse*response)@H_403_126@
  1. if(!response->isSucceed())//如果响应失败,输出错误信息@H_403_126@
  2. CCStringstrError;@H_403_126@
  3. strError.initWithFormat("ReceiveError!\n%s\n",response->getErrorBuffer());@H_403_126@
  4. m_labelStatusCode->setString(strError.getCString());@H_403_126@
  5. return;@H_403_126@
  6. std::vector<char>*buffer=response->getResponseData();//接收响应信息@H_403_126@
  7. stringrecieveData;@H_403_126@
  8. for(unsignedinti=0;i<buffer->size();i++)@H_403_126@
  9. recieveData+=(*buffer)[i];@H_403_126@
  10. size_tbegin=recieveData.find("<body>")+6;//这里简单处理,获取<body>标签内数据,即是响应内容@H_403_126@
  11. size_tend=recieveData.find("</body>");@H_403_126@
  12. stringresult(recieveData,begin,end-begin);@H_403_126@
  13. m_labelStatusCode->setString(result.c_str());@H_403_126@
  14. }@H_403_126@

5.效果

5.1.Apache运行(Get和Post两种效果都是一样的)

(1)帐号密码正确


(2)帐号密码错误


5.2.关闭Apache



6.源码下载

下载地址:http://download.csdn.net/detail/jackyvincefu/6713471

原文链接:https://www.f2er.com/cocos2dx/342128.html

猜你在找的Cocos2d-x相关文章