您的位置:首页 > 理论基础 > 计算机网络

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

2014-04-02 11:28 495 查看
一个网游的话,“登录功能”是客户端最基本的一个功能,这是客户端与服务端产生交互的第一步,那cURL这样的东西也不是浏览器,所以说只能是利用其内具的功能进行模拟登录服务器……所谓“模拟”:就是利用cURL直接发送或者说是提交一些相关的信息到服务器端特定的页面,然后通过接收服务端返回的数据,将一些特定的信息记录下来,比如登录后返回的数据里面会有header中包含的sessionID,这个sessionID就是登录后服务器返回给用户的一个专有的登录标识,这个标识能让服务器识别是哪个用户登录了服务器,从而根据此用户的操作进行进一步地处理,如果还不清楚的话只有百度了……
前面介绍了cURL的基本使用,不过忘记说了,cocos2d-x2.14以后的版本封装的cURL和以前的不太一样,没有websockets.lib这个库,所以,如果还在用低版本的话,建议是用新版本,而且2.15以上的版本更稳定,解决了一些奇怪的BUG……废话不多说,上代码:

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

[php] view
plaincopy





<?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] view
plaincopy





<?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中的代码

[cpp] view
plaincopy





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的代码(直接全贴上来):

[cpp] view
plaincopy





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又新出了两个版本,重新下了老久,所以就没做了,看样子应该也不需要,有空再做吧……网络这块,我也是超级新手,基本都是自己琢磨的,如其中有错,欢迎交流指正,不甚感激……
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: