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

一个网游的话,“登录功能”是客户端最基本的一个功能,这是客户端与服务端产生交互的第一步,那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又新出了两个版本,重新下了老久,所以就没做了,看样子应该也不需要,有空再做吧……网络这块,我也是超级新手,基本都是自己琢磨的,如其中有错,欢迎交流指正,不甚感激……

  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值