一个网游的话,“登录功能”是客户端最基本的一个功能,这是客户端与服务端产生交互的第一步,那cURL这样的东西也不是浏览器,所以说只能是利用其内具的功能进行模拟登录服务器……所谓“模拟”:就是利用cURL直接发送或者说是提交一些相关的信息到服务器端特定的页面,然后通过接收服务端返回的数据,将一些特定的信息记录下来,比如登录后返回的数据里面会有header中包含的sessionID,这个sessionID就是登录后服务器返回给用户的一个专有的登录标识,这个标识能让服务器识别是哪个用户登录了服务器,从而根据此用户的操作进行进一步地处理,如果还不清楚的话只有百度了……
前面介绍了cURL的基本使用,不过忘记说了,cocos2d-x2.14以后的版本封装的cURL和以前的不太一样,没有websockets.lib这个库,所以,如果还在用低版本的话,建议是用新版本,而且2.15以上的版本更稳定,解决了一些奇怪的BUG……废话不多说,上代码:
首先是一段服务端的php代码,这部分的代码用来判断cURL提交过来的参数,然后对比数据是否匹配,决定是否能为请求登录的用户建立session进行与服务端的会话,这里用的是最简单的代码,超级菜鸟可别真的用到项目里去啊(保证怎么死的都不知道)……
- <?php
- /**
- * @version $Id: mobTest.php 1 14:17 2013-12-07 cyistudio $
- * @package learn
- * @copyright Copyright (c) 2013 - 2015, cyistudio
- * @link http://blog.csdn.net/cyistudio
- */
- $userName="";
- $password="";
- if(isset($userName)){
- //不了解PHP的话这里作个简单的解释:如果是URL传参,用GET获取参数值 , 用表单提交的话提交时的设置处理,一般来说表单提交是POST
- $userName=$_GET['user'];
- $password=$_GET['password'];
- //echo($userName);
- //echo($password);
- //简单地判断用户名和密码参数
- if($userName=="cyistudio" || $password="123"){
- echo("OK");
- //这里就可以在服务器上开一个session用来存放用户的登录状态
- session_start();
- $_SESSION['user']=$userName;
- //echo($_SESSION['user']);
- }else{
- echo("failed");
- }
- }
- ?>
上面这个是登录校验的php页面,一些注释懒得删除了,不懂php的可以慢慢学,这基础的东西也没什么难的。下面是第二个页面,就是获取登录信息的页面,这个页面执行后将根据登录状态返回一串状态文本:
- <?php
- /**
- * @version $Id: mobTest.php 1 14:17 2013-12-07 cyistudio $
- * @package learn
- * @copyright Copyright (c) 2013 - 2015, cyistudio
- * @link http://blog.csdn.net/cyistudio
- */
- session_start();
- //这里判断用户的session是否存在,如果存在则表明已经登录成功,否则就是非法请求
- if($_SESSION['user']<>"")
- echo("you are already Logged in");
- else
- echo("notLogin");
- ?>
接下来是客户端的代码,我仍然是写在了官方的curlTest例子里(因为是测试,所以代码写得很乱):
首先是.h中的代码
- class CurlTest : public CCLayer
- {
- public:
- CurlTest();
- ~CurlTest();
- virtual void ccTouchesEnded(cocos2d::CCSet *pTouches, cocos2d::CCEvent *pEvent);
- static size_t HttpWriteString(uint8_t* ptr,size_t size,size_t nmemb,void *stream);
- //获取登录后操作页面返回的网络数据的回调函数
- static size_t getLoginState(uint8_t* ptr,size_t size,size_t nmemb,void *stream);
- private:
- cocos2d::CCLabelTTF* m_pLabel;
- };
- class CurlTestScene : public TestScene
- {
- public:
- virtual void runThisTest();
- };
然后是cpp的代码(直接全贴上来):
- static bool isLogin;
- CurlTest::CurlTest()
- {
- CCLabelTTF* label = CCLabelTTF::create("Curl Test", "Arial", 28);
- addChild(label, 0);
- label->setPosition( ccp(VisibleRect::center().x, VisibleRect::top().y-50) );
- setTouchEnabled(true);
- // create a label to display the tip string
- m_pLabel = CCLabelTTF::create("Touch the screen to connect", "Arial", 22);
- m_pLabel->setPosition(VisibleRect::center());
- addChild(m_pLabel, 0);
- m_pLabel->retain();
- isLogin=false;
- }
- // the test code is
- // http://curl.haxx.se/mail/lib-2009-12/0071.html
- void CurlTest::ccTouchesEnded(CCSet *pTouches, CCEvent *pEvent)
- {
- CURL *curl;
- CURLcode res;
- char buffer[10];
- string strHtml;
- string strRetData = "";
- curl = curl_easy_init();
- if (curl)
- {
- curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/mobTest.php?user=cistudio&password=123");
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, HttpWriteString);
- curl_easy_setopt(curl, CURLOPT_WRITEDATA, strHtml);
- curl_easy_setopt(curl, CURLOPT_FAILONERROR, true);
- curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);
- // 对认证证书来源的检查,0表示阻止对证书的合法性的检查。
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
- // 从证书中检查SSL加密算法是否存在
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1);
- //模拟用户使用的浏览器,在HTTP请求中包含一个”user-agent”头的字符串。
- curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0)");
- //curl_easy_setopt(curl,CURLOPT_COOKIEFILE,"cookiefile.txt");
- //将登录信息记录并生成到一个cookies文件中
- curl_easy_setopt(curl,CURLOPT_COOKIEJAR,"cookiefile.txt");
- //curl_easy_setopt(curl, CURLOPT_HEADER, 0); // 不返回header部分
- //curl_easy_setopt(curl, CURLOPT_NOBODY, true); // 不返回header部分
- // 获取的信息以文件流的形式返回,而不是直接输出。
- curl_easy_setopt(curl, CURLOPT_TRANSFERTEXT,1);
- res = curl_easy_perform(curl);
- /* always cleanup */
- curl_easy_cleanup(curl);
- if (res == CURLE_OK)
- {
- m_pLabel->setString("0 response");
- strRetData = strHtml;
- CCLOG("Http get string, ret: %s", strRetData.c_str());
- }
- else
- {
- sprintf(buffer,"code: %i",res);
- m_pLabel->setString(buffer);
- }
- }
- else
- {
- m_pLabel->setString("no curl");
- }
- }
- size_t CurlTest::HttpWriteString(uint8_t* ptr,size_t size,size_t number,void *stream)
- {
- char tmpStr[10];
- sprintf(tmpStr,"%s",ptr);
- if(tmpStr=="OK"){
- isLogin=true;
- }else{
- isLogin=false;
- }
- CURL *curl;
- CURLcode res;
- curl = curl_easy_init();
- if (curl)
- {
- curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/isLoginTest.php");
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, getLoginState);
- curl_easy_setopt(curl, CURLOPT_FAILONERROR, true);
- curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);
- // 对认证证书来源的检查,0表示阻止对证书的合法性的检查。
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYPEER, 0);
- // 从证书中检查SSL加密算法是否存在
- curl_easy_setopt(curl, CURLOPT_SSL_VERIFYHOST, 1);
- //模拟用户使用的浏览器,在HTTP请求中包含一个”user-agent”头的字符串。
- curl_easy_setopt(curl, CURLOPT_USERAGENT, "Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 5.0)");
- //curl_easy_setopt(curl, CURLOPT_HEADER, 0); // 不返回header部分
- //curl_easy_setopt(curl, CURLOPT_NOBODY, true); // 不返回header部分
- //读取cookies中的信息供给服务器调用
- curl_easy_setopt(curl,CURLOPT_COOKIEFILE,"cookiefile.txt");
- //curl_easy_setopt(curl,CURLOPT_COOKIEJAR,"cookiefile.txt");
- res = curl_easy_perform(curl);
- /* always cleanup */
- curl_easy_cleanup(curl);
- if (res == CURLE_OK)
- {
- CCLog("completes getLoginState");
- }
- }
- CCLog("%s%1d",ptr,number);
- return size*number;//这里一定要返回实际返回的字节数
- }
- size_t CurlTest::getLoginState(uint8_t* ptr,size_t size,size_t number,void *stream)
- {
- CCLog("%s",ptr);
- return size*number;//这里一定要返回实际返回的字节数
- }
- CurlTest::~CurlTest()
- {
- m_pLabel->release();
- }
- void CurlTestScene::runThisTest()
- {
- CCLayer *pLayer = new CurlTest();
- addChild(pLayer);
- CCDirector::sharedDirector()->replaceScene(this);
- pLayer->release();
- }
运行代码后,程序会先访问登录页,如果登录参数没问题的话就会产生一个登录会话,记录登录信息,然后代码会继续执行第二次请求用于获取登录状态,如果登录正常,则会返回已经登录的信息,否则会显示出一个未登录的信息。
本来想做项目源代码的,没成想这建立项目的py出问题了,然后发现cocos2d-x又新出了两个版本,重新下了老久,所以就没做了,看样子应该也不需要,有空再做吧……网络这块,我也是超级新手,基本都是自己琢磨的,如其中有错,欢迎交流指正,不甚感激……