cocos2d-x 网络编程二(cURL简单模拟登录的实现)

一个网游的话,“登录功能”是客户端最基本的一个功能,这是客户端与服务端产生交互的第一步,那cURL这样的东西也不是浏览器,所以说只能是利用其内具的功能进行模拟登录服务器……所谓“模拟”:就是利用cURL直接发送或者说是提交一些相关的信息到服务器端特定的页面,然后通过接收服务端返回的数据,将一些特定的信息记录下来,比如登录后返回的数据里面会有header中包含的sessionID,这个sessionID就是登录后服务器返回给用户的一个专有的登录标识,这个标识能让服务器识别是哪个用户登录了服务器,从而根据此用户的操作进行进一步地处理,如果还不清楚的话只有百度了……

前面介绍了cURL的基本使用,不过忘记说了,cocos2d-x2.14以后的版本封装的cURL和以前的不太一样,没有websockets.lib这个库,所以,如果还在用低版本的话,建议是用新版本,而且2.15以上的版本更稳定,解决了一些奇怪的BUG……废话不多说,上代码:

首先是一段服务端的php代码,这部分的代码用来判断cURL提交过来的参数,然后对比数据是否匹配,决定是否能为请求登录的用户建立session进行与服务端的会话,这里用的是最简单的代码,超级菜鸟可别真的用到项目里去啊(保证怎么死的都不知道)……

[php]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?php  
  2. /** 
  3.  * @version        $Id: mobTest.php 1 14:17 2013-12-07 cyistudio $ 
  4.  * @package        learn 
  5.  * @copyright      Copyright (c) 2013 - 2015, cyistudio 
  6.  * @link           http://blog.csdn.net/cyistudio 
  7.  */  
  8. $userName="";  
  9. $password="";  
  10.   
  11. if(isset($userName)){  
  12. //不了解PHP的话这里作个简单的解释:如果是URL传参,用GET获取参数值 , 用表单提交的话提交时的设置处理,一般来说表单提交是POST  
  13. $userName=$_GET['user'];  
  14. $password=$_GET['password'];  
  15. //echo($userName);    
  16. //echo($password);  
  17. //简单地判断用户名和密码参数   
  18. if($userName=="cyistudio" || $password="123"){  
  19. echo("OK");   
  20. //这里就可以在服务器上开一个session用来存放用户的登录状态  
  21. session_start();  
  22. $_SESSION['user']=$userName;  
  23. //echo($_SESSION['user']);  
  24. }else{  
  25. echo("failed");   
  26. }  
  27. }  
  28. ?>  

上面这个是登录校验的php页面,一些注释懒得删除了,不懂php的可以慢慢学,这基础的东西也没什么难的。下面是第二个页面,就是获取登录信息的页面,这个页面执行后将根据登录状态返回一串状态文本:

[php]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. <?php  
  2. /** 
  3.  * @version        $Id: mobTest.php 1 14:17 2013-12-07 cyistudio $ 
  4.  * @package        learn 
  5.  * @copyright      Copyright (c) 2013 - 2015, cyistudio 
  6.  * @link           http://blog.csdn.net/cyistudio 
  7.  */  
  8.    
  9. session_start();  
  10. //这里判断用户的session是否存在,如果存在则表明已经登录成功,否则就是非法请求  
  11. if($_SESSION['user']<>"")  
  12. echo("you are already Logged in");  
  13. else  
  14. echo("notLogin");  
  15. ?>  

接下来是客户端的代码,我仍然是写在了官方的curlTest例子里(因为是测试,所以代码写得很乱):

首先是.h中的代码

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. class CurlTest : public CCLayer  
  2. {  
  3. public:  
  4.     CurlTest();  
  5.     ~CurlTest();  
  6.   
  7.     virtual void ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);  
  8.     static size_t HttpWriteString(uint8_t* ptr,size_t size,size_t nmemb,void *stream);  
  9.         //获取登录后操作页面返回的网络数据的回调函数  
  10.     static size_t getLoginState(uint8_t* ptr,size_t size,size_t nmemb,void *stream);  
  11. private:  
  12.     cocos2d::CCLabelTTF*         m_pLabel;  
  13. };  
  14.   
  15. class CurlTestScene : public TestScene  
  16. {  
  17.       
  18. public:  
  19.     virtual void runThisTest();  
  20. };  

然后是cpp的代码(直接全贴上来):

[cpp]  view plain copy 在CODE上查看代码片 派生到我的代码片
  1. static bool isLogin;  
  2.   
  3. CurlTest::CurlTest()  
  4. {  
  5.     CCLabelTTF* label = CCLabelTTF::create("Curl Test""Arial", 28);  
  6.     addChild(label, 0);  
  7.     label->setPosition( ccp(VisibleRect::center().x, VisibleRect::top().y-50) );  
  8.   
  9.     setTouchEnabled(true);  
  10.   
  11.     // create a label to display the tip string  
  12.     m_pLabel = CCLabelTTF::create("Touch the screen to connect""Arial", 22);  
  13.     m_pLabel->setPosition(VisibleRect::center());  
  14.     addChild(m_pLabel, 0);  
  15.       
  16.     m_pLabel->retain();  
  17.     isLogin=false;  
  18. }  
  19.   
  20.   
  21. // the test code is  
  22. // http://curl.haxx.se/mail/lib-2009-12/0071.html  
  23. void CurlTest::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)  
  24. {  
  25.     CURL *curl;  
  26.     CURLcode res;  
  27.     char buffer[10];  
  28.     string strHtml;  
  29.     string strRetData = "";  
  30.   
  31.     curl = curl_easy_init();  
  32.     if (curl)   
  33.     {  
  34.                 curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/mobTest.php?user=cistudio&password=123");  
  35. curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, HttpWriteString);  
  36. curl_easy_setopt(curl, CURLOPT_WRITEDATA, strHtml);  
  37. curl_easy_setopt(curl, CURLOPT_FAILONERROR, true);  
  38. curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);  
  39. // 对认证证书来源的检查,0表示阻止对证书的合法性的检查。  
  40. curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);  
  41.   
  42. // 从证书中检查SSL加密算法是否存在  
  43. curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1);  
  44.   
  45. //模拟用户使用的浏览器,在HTTP请求中包含一个”user-agent”头的字符串。  
  46. curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0)");  
  47. //curl_easy_setopt(curl,CURLOPT_COOKIEFILE,"cookiefile.txt");  
  48. //将登录信息记录并生成到一个cookies文件中  
  49. curl_easy_setopt(curl,CURLOPT_COOKIEJAR,"cookiefile.txt");  
  50.         //curl_easy_setopt(curl, CURLOPT_HEADER, 0);   // 不返回header部分  
  51.         //curl_easy_setopt(curl, CURLOPT_NOBODY, true);   // 不返回header部分  
  52. // 获取的信息以文件流的形式返回,而不是直接输出。  
  53. curl_easy_setopt(curl, CURLOPT_TRANSFERTEXT,1);  
  54.   
  55.   
  56.         res = curl_easy_perform(curl);  
  57.         /* always cleanup */  
  58.         curl_easy_cleanup(curl);  
  59.         if (res == CURLE_OK)  
  60.         {  
  61.             m_pLabel->setString("0 response");  
  62.             strRetData = strHtml;  
  63.      
  64.     CCLOG("Http get string, ret: %s",  strRetData.c_str());  
  65.         }  
  66.         else  
  67.         {  
  68.             sprintf(buffer,"code: %i",res);  
  69.             m_pLabel->setString(buffer);  
  70.         }  
  71.     }   
  72.     else   
  73.     {  
  74.         m_pLabel->setString("no curl");  
  75.     }   
  76. }  
  77.   
  78. size_t CurlTest::HttpWriteString(uint8_t* ptr,size_t size,size_t number,void *stream)    
  79. {    
  80. char tmpStr[10];  
  81. sprintf(tmpStr,"%s",ptr);  
  82.   if(tmpStr=="OK"){  
  83.       isLogin=true;  
  84.   
  85.   }else{  
  86.       isLogin=false;  
  87.   }  
  88.               CURL *curl;  
  89.     CURLcode res;  
  90.   
  91.     curl = curl_easy_init();  
  92.     if (curl)   
  93.     {  
  94.                 curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/isLoginTest.php");  
  95. curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, getLoginState);  
  96. curl_easy_setopt(curl, CURLOPT_FAILONERROR, true);  
  97. curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);  
  98. // 对认证证书来源的检查,0表示阻止对证书的合法性的检查。  
  99. curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);  
  100.   
  101. // 从证书中检查SSL加密算法是否存在  
  102. curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1);  
  103.   
  104. //模拟用户使用的浏览器,在HTTP请求中包含一个”user-agent”头的字符串。  
  105. curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0)");  
  106.   
  107.         //curl_easy_setopt(curl, CURLOPT_HEADER, 0);   // 不返回header部分  
  108.         //curl_easy_setopt(curl, CURLOPT_NOBODY, true);   // 不返回header部分  
  109. //读取cookies中的信息供给服务器调用  
  110. curl_easy_setopt(curl,CURLOPT_COOKIEFILE,"cookiefile.txt");  
  111. //curl_easy_setopt(curl,CURLOPT_COOKIEJAR,"cookiefile.txt");  
  112.   
  113.   
  114.         res = curl_easy_perform(curl);  
  115.         /* always cleanup */  
  116.         curl_easy_cleanup(curl);  
  117.         if (res == CURLE_OK)  
  118.         {  
  119.            CCLog("completes getLoginState");  
  120.         }  
  121.     }  
  122.     CCLog("%s%1d",ptr,number);    
  123.     return size*number;//这里一定要返回实际返回的字节数    
  124. }  
  125.   
  126. size_t CurlTest::getLoginState(uint8_t* ptr,size_t size,size_t number,void *stream)    
  127. {    
  128.   
  129.     CCLog("%s",ptr);    
  130.     return size*number;//这里一定要返回实际返回的字节数    
  131. }  
  132.   
  133. CurlTest::~CurlTest()  
  134. {  
  135.     m_pLabel->release();  
  136. }  
  137.   
  138. void CurlTestScene::runThisTest()  
  139. {  
  140.     CCLayer *pLayer = new CurlTest();  
  141.     addChild(pLayer);  
  142.   
  143.     CCDirector::sharedDirector()->replaceScene(this);  
  144.     pLayer->release();  
  145. }  

运行代码后,程序会先访问登录页,如果登录参数没问题的话就会产生一个登录会话,记录登录信息,然后代码会继续执行第二次请求用于获取登录状态,如果登录正常,则会返回已经登录的信息,否则会显示出一个未登录的信息。

本来想做项目源代码的,没成想这建立项目的py出问题了,然后发现cocos2d-x又新出了两个版本,重新下了老久,所以就没做了,看样子应该也不需要,有空再做吧……网络这块,我也是超级新手,基本都是自己琢磨的,如其中有错,欢迎交流指正,不甚感激……

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
蛋白质是生物体中普遍存在的一类重要生物大分子,由天然氨基酸通过肽键连接而成。它具有复杂的分子结构和特定的生物功能,是表达生物遗传性状的一类主要物质。 蛋白质的结构可分为四级:一级结构是组成蛋白质多肽链的线性氨基酸序列;级结构是依靠不同氨基酸之间的C=O和N-H基团间的氢键形成的稳定结构,主要为α螺旋和β折叠;三级结构是通过多个级结构元素在三维空间的排列所形成的一个蛋白质分子的三维结构;四级结构用于描述由不同多肽链(亚基)间相互作用形成具有功能的蛋白质复合物分子。 蛋白质在生物体内具有多种功能,包括提供能量、维持电解质平衡、信息交流、构成人的身体以及免疫等。例如,蛋白质分解可以为人体提供能量,每克蛋白质能产生4千卡的热能;血液里的蛋白质能帮助维持体内的酸碱平衡和血液的渗透压;蛋白质是组成人体器官组织的重要物质,可以修复受损的器官功能,以及维持细胞的生长和更新;蛋白质也是构成多种生理活性的物质,如免疫球蛋白,具有维持机体正常免疫功能的作用。 蛋白质的合成是指生物按照从脱氧核糖核酸(DNA)转录得到的信使核糖核酸(mRNA)上的遗传信息合成蛋白质的过程。这个过程包括氨基酸的活化、多肽链合成的起始、肽链的延长、肽链的终止和释放以及蛋白质合成后的加工修饰等步骤。 蛋白质降解是指食物中的蛋白质经过蛋白质降解酶的作用降解为多肽和氨基酸然后被人体吸收的过程。这个过程在细胞的生理活动中发挥着极其重要的作用,例如将蛋白质降解后成为小分子的氨基酸,并被循环利用;处理错误折叠的蛋白质以及多余组分,使之降解,以防机体产生错误应答。 总的来说,蛋白质是生物体内不可或缺的一类重要物质,对于维持生物体的正常生理功能具有至关重要的作用。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值