一个网游的话,“登录功能”是客户端最基本的一个功能,这是客户端与服务端产生交互的第一步,那cURL这样的东西也不是浏览器,所以说只能是利用其内具的功能进行模拟登录服务器……所谓“模拟”:就是利用cURL直接发送或者说是提交一些相关的信息到服务器端特定的页面,然后通过接收服务端返回的数据,将一些特定的信息记录下来,比如登录后返回的数据里面会有header中包含的sessionID,这个sessionID就是登录后服务器返回给用户的一个专有的登录标识,这个标识能让服务器识别是哪个用户登录了服务器,从而根据此用户的操作进行进一步地处理,如果还不清楚的话只有百度了……
前面介绍了cURL的基本使用,不过忘记说了,cocos2d-x2.14以后的版本封装的cURL和以前的不太一样,没有websockets.lib这个库,所以,如果还在用低版本的话,建议是用新版本,而且2.15以上的版本更稳定,解决了一些奇怪的BUG……废话不多说,上代码:首先是一段服务端的php代码,这部分的代码用来判断cURL提交过来的参数,然后对比数据是否匹配,决定是否能为请求登录的用户建立session进行与服务端的会话,这里用的是最简单的代码,超级菜鸟可别真的用到项目里去啊(保证怎么死的都不知道)……
上面这个是登录校验的php页面,一些注释懒得删除了,不懂php的可以慢慢学,这基础的东西也没什么难的。下面是第二个页面,就是获取登录信息的页面,这个页面执行后将根据登录状态返回一串状态文本:
"")
echo("you are already Logged in");
else
echo("notLogin");
?>
首先是.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();
};
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又新出了两个版本,重新下了老久,所以就没做了,看样子应该也不需要,有空再做吧……网络这块,我也是超级新手,基本都是自己琢磨的,如其中有错,欢迎交流指正,不甚感激……