>  기사  >  백엔드 개발  >  cocos2d-x网络编程 连接php服务器笔记4

cocos2d-x网络编程 连接php服务器笔记4

WBOY
WBOY원래의
2016-06-23 13:33:33856검색

VS工程部分----网络编程

本节会把最终实现代码和资源放在文章最未提供各位下载学习。

本节我们开始重头戏联网功能的开发,我用的是cocos2d-x绑定的curl库,这个curl据说很火,虽然我本人了解的不多只晓得基本用法,让大家见笑了。好了想用这个库还是要在工程里设置下的,如开头要包含头文件 #include "curl/curl.h" (官方写法)

这样写需要工程属性 -> 链接器-》附加库目录里加上curl路径,假如你跟我一样觉不明所以干脆写全:#include "curl/include/win32/curl/curl.h"这样一定没问题

此外还要包含下curl的lib,在工程属性 -> 链接器->输入->附加依赖项加上“libcurl_imp.lib”,“ws2_32.lib”,“wldap32.lib”  第一个最重要一定要加,后两个lib网上教程说要加不知道是不是真的需要。

开始正式工作了,在上节onBtnLoginClicked 就是登录按钮响应代码里,把txtUser->setString("click login btn");这一行注掉,在下面写这样的代码:

        //0 获取用户名和密码		string strUser = txtUser->getString(); 		string strPass = txtPass->getString();		//1 curl初始化		CURL* curl = curl_easy_init();		if (curl)  //如果初始化成功		{			char url[1000] = {0};              //我们根据用户输入的用户名和密码拼出请求url						sprintf(url, "http://127.0.0.1/testPhp/checkLogin02.php?uname=%s&upass=%s",strUser.c_str(), strPass.c_str());			int res;			//2 网络连接初始化			res = curl_easy_setopt(curl, CURLOPT_URL, url);  //设置要连接的网址, res返回0表示成功			//3 设定数据接收方法			curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, processData);			//4 设定数据接收变量			std::string recvbuf;			curl_easy_setopt(curl, CURLOPT_WRITEDATA, &recvbuf);			//5 发起联网请求			res = curl_easy_perform(curl);			//6 处理结果,根据网络连接返回的结果实现跳转和提示			if (CURLE_OK == res)  //CURLE_OK == 0			{				if (recvbuf.compare("1")==0)  //如果返回结果为1,即用户名和密码匹配上				{					//保存用户的name					//HelloWorld::setUname(strUser);					//登录成功,跳转到游戏场景,这里GameScene就是诸位的正式游戏场景,我没实现,请见谅					//Director::getInstance()->replaceScene(GameScene::scene());					lblResult->setString("Login Success!");				}				else  //否则登录失败				{					lblResult->setString("Login Failed!");				}			}		}
注释的很详细,大家也能看出curl的基本用法,需要curl_easy_setopt设置下CURLOPT_URL:请求网址, 设置CURLOPT_WRITEFUNCTION:数据接收的方法,还有CURLOPT_WRITEDATA:用于存放接受返回数据的字符串。其中CURLOPT_WRITEFUNCTION非常重要,决定了接收数据成功与否是什么。然后一切设定好后执行curl_easy_perform就可以执行网络请求,并得到服务器发来的响应数据,就是我们想要的登录是否成功。

注意这个curl_easy_perform函数是个大坑,curl库这里错误处理写的很不友好,不论出什么错执行到curl_easy_perform都是瞬间运行时崩溃,没任何assert出错提示,让用户莫名其妙,无法调试。其实错误大多是上面curl_easy_setopt设置错误,特别是CURLOPT_WRITEFUNCTION,数据接收方法可能参数错了这里就会崩溃,我把那个processData函数贴出来:

size_t processData(char *ptr, std::size_t size, std::size_t nmemb, std::string *stream){	//char* ptr就是返回的服务器数据,服务器echo 1,这里就返回"1"	log("正在写入数据");	if (stream == NULL)	{		return 0;	}	size_t sizes = size * nmemb;	//string* ss = (string *)stream;	stream->append(ptr, sizes);	return sizes;}
函数参数格式要严格照此书写,注意不能把此函数写成类的成员函数,只能写成类内部函数,否则执行curl_easy_perform铁定出错,此函数参数char* ptr是服务器传回的数据首地址,size大概是一个数据包多少字节,nmemb大概是有多少数据包意思,stream就是我们在设置CURLOPT_WRITEDATA时设置的接收数据字符串recvbuf,这样一来函数意思也就很明白了,无非就是根据服务器返回的字节多少把char* ptr内存的数据拷到stream,就是recvbuf里去,这样我们就得到了服务器返回的接收数据


好了大功告成,可以运行了,运行前一定记得把服务器打开,就是运行phpStudy,启动apache和mysql,像下图这样


以防万一建议还是在浏览器里手动输入网址:   http://127.0.0.1/testPhp/checkLogin02.php?uname=wang&upass=123

看下服务器是否正常,别搞得服务器都没开就调试,结果就是登录失败而抓狂-_-

好了,大家试验下吧,这样应该在UI界面显示登录成功了,截图我也不截了。

源代码+资源文件


성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.