最近打算做个网络项目,所以开始学习网络这块,不过自己的基础和理解力太差了,很多东西感觉太抽象……学一点是一点吧,能做出来就行……
通过查阅大虾们写的博客,知道了cocos2d-x里同样可以用两类网络通信方式:http和socket,http的主要用的是cURL,socket看上去要高端一些,用于更复杂的网络交互。所以先从cURL开始学起吧……
思考了下,感觉cURL用来制作游戏的话主要是用在简单类游戏,利用客户端发送的url链接,可以将变量发送到动态网页如php,借由php根据传送过来的变量做出对应处理后返回数据给客户端,再由客户端通过自定义的解析拿到对应返回数据(因为返回的数据都是http数据,所以要自己解析出返回数据中需要的信息),从而达到网络数据交互。
下面是通过修改官方原例curl test中代码,获取百度网页源代码的例子:
- //这是链接数据返回时调用的数据接收回调函数
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, HttpWriteString);
- //这里设置的是当链接发生错误时终止运行
- curl_easy_setopt(curl, CURLOPT_FAILONERROR, true);
- //设置链接超时
- curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);
上面的代码是在链接时根据需要来进行设置的,第一行是用来显示http链接请求后接收到返回数据时的回调函数,在例子中是用来显示打印出了返回的数据内容:
.h文件中在主层里先声明这段:
- static size_t HttpWriteString(uint8_t* ptr,size_t size,size_t nmemb,void *stream);
然后是cpp中的对应代码:
- size_t CurlTest::HttpWriteString(uint8_t* ptr,size_t size,size_t number,void *stream)
- {
- CCLog("%s",ptr);
- return size*number;//这里一定要返回实际返回的字节数
- }
其实回调函数的具体参数还没研究过,只是先试练下……需要了解的就只好自己看文档资料了……
上面设置好以后,官方原例中的代码是这样的:
- CURL *curl;
- CURLcode res;
- char buffer[10];
- //初始化
- curl = curl_easy_init();
- //初始化OK后执行下面的代码
- if (curl)
- {
- //这是上面说过的代码
- curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, HttpWriteString);
- curl_easy_setopt(curl, CURLOPT_FAILONERROR, true);
- curl_easy_setopt(curl, CURLOPT_TIMEOUT, 10);
- //设置http链接到百度首页
- curl_easy_setopt(curl, CURLOPT_URL, "http://www.baidu.com");
- //执行链接后会返回一个curlCode,这个code有很多参数,0或者CURLE_OK表示链接成功,其它的就只好自己查阅了
- res = curl_easy_perform(curl);
- /* always cleanup */
- curl_easy_cleanup(curl);
- if (res == CURLE_OK)
- {
- m_pLabel->setString("0 response");
- }
- else
- {
- sprintf(buffer,"code: %i",res);
- m_pLabel->setString(buffer);
- }
- }
- else
- {
- m_pLabel->setString("no curl");
- }
改好后再运行官方的testCPP,如果网络正常的话,就能看到输出栏里会显示出返回的百度首页的网页源代码。通过curl_easy_setopt 可以设置很多链接参数,包括get/post提交数据,链接时的验证信息,cookies等等,这个还真得慢慢研究了……回头做个网络登录界面看看!