在上一篇博客中,我们一起学习了如何在Cocos2d-x中存储数据和读取信息,本篇博客我们将一起讨论和数据存储同样重要的联网技术。

  一、弱联网技术介绍

  在网络游戏中许多重要的功能都需要网络连接,而根据需要的不同,这些连接大体可分为弱联网和强联网两种。比如,在《微信飞机大战》或者《开心消消乐》这类的游戏中,玩家在本地进行游戏,只有最后才会上传成绩到服务器进行排名或者将成绩分享。这样数据量和频率都比较低的网络通信就可以使用弱联网技术。而在一些需要实时对话或者处理大量的数据的游戏中弱联网就不再适合,需要使用强联网技术了。

  一般来说,弱联网技术都采用了某种web方式通过HTTP协议来传输数据,而强联网技术则通过Socket的方式由开发者根据需要来制定某种协议进行通信。

  二、通过HTTP协议获取网站信息

  在Cocos2d-x中使用HTTP协议传输数据的话,需要用到第三方库CURL。在使用第三方库之前,需要先将它添加到项目中,具体做法如下:

  1.在vs中选中项目并且右键,选择属性,然后在下图的位置中引入libcurl_imp.lib库:

  2.然后在vc++目录的包含目录里面引入curl.h的路径,如下图,填入你的cocos引擎中curl.h的绝对路径就可以了。

  好了。开发环境配置完了,下面开始写代码了,照例还是先上一下代码和效果图然后再解释:

  

 bool HelloWorld::init()
{
if (!Layer::init())
{
return false;
}
curl_global_init(CURL_GLOBAL_ALL); //对CURL的全局变量进行初始化
CURL* curl = curl_easy_init();
curl_easy_setopt(curl, CURLOPT_URL, "http://www.baidu.com/"); //设置访问的URL
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, info_output); //设置回调函数用以处理get到的信息
CURLcode success = curl_easy_perform(curl); //返回HTTP请求的状态
curl_global_cleanup(); //清除CURL全局变量
return true;
}
size_t HelloWorld::info_output(void* buffer, size_t size, size_t nmemb, void *userp)
{
CCLOG("============================================================");
CCLOG("%s", buffer);
CCLOG("============================================================");
return ;
}

  运行效果:

  首先,在使用CURL之前要进行环境的初始化工作,使curl_global_init(CURL_GLOBAL_ALL)就可以进行全局变量初始化工作,如代码第7行所示。之后使用curl_easy_init()语句创建一个对象并且完成对象的初始化工作,如代码第8行所示。代码的第9行和第10行是用来设置一些HTTP请求的参数,包括需要访问的URL地址和通过哪个方法处理返回的信息。当我们接收到信息以后就可以使用log函数打印输出了。最后别忘了使用curl_global_cleanup()方法做清理工作,否则会造成不必要的资源占用。

  三、通过HTTP协议向服务端发送请求

  在HTTP中有两种向服务器发送信息的方式分别是GET和POST方式,相信稍微有一些网络编程经验的朋友对他们一定不会陌生。在Cocos2d-x中通过GET\POST发送信息的方法也和web编程中的大同小异,下面我们就来了解一下。

  1.GET方法传递数据

  通过GET方式传递数据是比较简单的,只要在URL后面添加参数就可以了。

curl_easy_setopt(curl, CURLOPT_URL, "http://www.xxx.com/test.php?id=123&type=5");

  2.POST方法传递数据

  相对GET方法,POST方法使用起来比较复杂,需要如下的代码:

curl_easy_setopt(curl, CURLOPT_URL, "http://www.xx.com/test.php");
curl_easy_setopt(curl, CURLOPT_POST, true);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "ad=123&type=5");
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);

  代码的第1行设置了要访问的URL,代码的第2行设置了使用POST方式发送数据,代码第3行设置了需要传递的数据的具体内容,最后一行是设置了在启用时会将服务器返回的"Location:"放在header中递归的返回给服务器。简单来说就是在使用POST的方式进行类似登录的操作时会发生页面跳转,然后CURL会接着去读取跳转后的页面。

  最后我们还是通过编写一个模仿用户登录的小实例来演示一下如何使用POST和GET方法向服务器递交数据:

  1.服务器端:

  首先,可以使用PHP编写一个简单的服务器端然后在本地服务器运行,用于处理接收到数据,这里我只是简单的将接收到消息返回给客户端:

 <?php

 if ( isset($_GET['username']) && isset($_GET['password']) )
echo 'username is '.$_GET['username'].' and password is '.$_GET['password'];
else if ( isset($_POST['username']) && isset($_POST['password']) )
echo 'username is '.$_POST['username'].' and password is '.$_POST['password'];
else
echo 'error'; ?>

  2.客户端:

  我们对之前的代码稍加改写并添加一些功能就可以用来传递数据了:

  

 bool HelloWorld::init()
{
if (!Layer::init())
{
return false;
}
curl_global_init(CURL_GLOBAL_ALL); //对CURL的全局变量进行初始化
CURL* curl = curl_easy_init();
//首先使用GET方法发送数据
curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/Test/test.php?username=admin&password=123456");
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, info_output_get); //设置回调函数用以处理获取到的信息
CURLcode success = curl_easy_perform(curl); //返回HTTP请求的状态
//然后使用POST方法发送数据
curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/Test/test.php");
curl_easy_setopt(curl, CURLOPT_POST, true);
curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "username=admin&password=123456");
curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, info_output_post); //设置回调函数用以处理获取到的信息
success = curl_easy_perform(curl); //返回HTTP请求的状态
curl_global_cleanup(); //清除CURL全局变量
return true;
}
size_t HelloWorld::info_output_get(void* buffer, size_t size, size_t nmemb, void *userp)
{
CCLOG("===========================GET METHOD============================");
CCLOG("%s", buffer);
CCLOG("============================================================");
return ;
} size_t HelloWorld::info_output_post(void* buffer, size_t size, size_t nmemb, void *userp)
{
CCLOG("============================POST METHOD=========================");
CCLOG("%s", buffer);
CCLOG("============================================================");
return ;
}

  运行演示:

  可以看到,程序分别使用GET和POST方法发送数据到了服务端,并且各自调用了相应的函数来处理服务器端返回的数据。

  最后再总结一下GET和POST两种方法的优缺点:

  1.GET方式传递的数据大小不能超过2KB,而POST方式在理论上是可以无限大的。

  2.POST方式比GET方式更加安全。

  3.GET方式调试起来更加方便。

  本篇博客代码已经同步至Github,欢迎fork!

  地址:https://github.com/XINCGer/Cocos2d-X_Tools/tree/master/Cocos2d-x_Demo/WeakNetworking

  好了,关于Cocos2d-x的弱联网技术就介绍到这里了,强联网技术主要使用的是Socket编程和多线程编程的使用,其实和Linux下的socket编程、多线程编程差不多,具体使用方法可以参考《UNIX网络编程卷1》或者其它类似书籍及博客

  

作者:马三小伙儿
出处:http://www.cnblogs.com/msxh/p/5790767.html 
请尊重别人的劳动成果,让分享成为一种美德,欢迎转载。另外,文章在表述和代码方面如有不妥之处,欢迎批评指正。留下你的脚印,欢迎评论!

【Cocos2d-x游戏开发】Cocos2d-x中的弱联网技术的更多相关文章

  1. 【Cocos2d-x游戏开发】Cocos2d-x中的数据存储技术

    一.引言 数据存储和网络功能可以说是一款游戏中必不可少的功能,如果一款游戏不能保存进度那么它的可玩性必然大打折扣(试想一下,玩家辛辛苦苦玩了一整天的游戏,结果退出时告诉人家不能保存关卡信息,你明天还得 ...

  2. iOS cocos2d 2游戏开发实战(第3版)书评

    2013是游戏爆发的一年,手游用户也是飞速暴增.虽然自己不做游戏,但也是时刻了解手机应用开发的新动向.看到CSDN的"写书评得技术图书赢下载分"活动,就申请了一本<iOS c ...

  3. 基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(中)

    接<基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(上)> 三.代码分析 1.界面初始化 bool PlaneWarGame::init() { bool bRet = fals ...

  4. 《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画

    本系列文章由七十一雾央编写,转载请注明出处.  http://blog.csdn.net/u011371356/article/details/9334121 作者:七十一雾央 新浪微博:http:/ ...

  5. ios游戏开发--cocos2d学习(2)

    在第一节中简单介绍了2d项目模板HelloWorld的基础代码,并做了一点小小的改变,像触摸接收.旋转.移动和颜色转变序列CCSequence的使用等等,2d本身封装好了很多方便使用的动作,只需要调用 ...

  6. ios游戏开发--cocos2d学习(1)

    学习cocos2d需要一定的编程基础,最好了解objective-c的语法.至于下载和安装的过程网上有很多,这里不多介绍,直接进入项目的学习. 创建一个cocos2d项目,直接运行,效果如图: 左下角 ...

  7. ios游戏开发--cocos2d学习(3)

    ------------继续上一节的内容. “接收触摸事件”: CCLayer类是用来接收触摸输入的.不过你要首先启用这个功能才可以使用它. self.isTouchEnabled = YES;//此 ...

  8. cocos2d 游戏开发:Cocos2d v3 &quot;hello world&quot;+显示飞船

    V3 RC4 版本号图片 显示一个飞船 将Chapter1中 SpaceCargoShip.png 文件 加入到项目里面. 代码在 init : CCSprite *spaceCargoShip = ...

  9. 【Unity3d游戏开发】Unity3D中的3D数学基础---向量

    向量是2D.3D数学研究的标准工具,在3D游戏中向量是基础.因此掌握好向量的一些基本概念以及属性和常用运算方法就显得尤为重要.在本篇博客中,马三就来和大家一起回顾和学习一下Unity3D中那些常用的3 ...

随机推荐

  1. WIN7 + IIS7 Service Unavailable HTTP Error 503. The service is unavailable.

    在win7上开启IIS功能,进行网站发布. 但是开启IIS之后,打开默认网站都打不开,显示 Service Unavailable HTTP Error 503. The service is una ...

  2. 主流ORM对比分析,莫人云亦云

    目前主流的ORM框架有Entity Framework,Dapper,NHibernate,NBear,Castle ActiveRecord,BATIS.NET六种,都是免费开源的.下边从官方支持性 ...

  3. CSS3中的变形处理

    在css3中,可以利用transform功能来实现文字或者图像的旋转.缩放.倾斜.移动这四种类型的变形处理. 旋转 旋转功能使用rotate方法参数中加入角度值,方向为顺时针旋转.示例清单如下: &l ...

  4. js/javascript代码注释规范与示例

    文件注释 文件注释位于文件的最前面,应包括文件的以下信息:概要说明及版本(必须)项目地址(开源组件必须)版权声明(必须)开源协议(开源组件必须)版本号(必须)修改时间(必须),以ISO格式表示(可使用 ...

  5. 2.2WebApi路由在Action上

    这篇文章描述 ASP.NET Web API 如何将 HTTP 请求路由到特定的操作在控制器上. 有关路由的高级别概述,请参见ASP.NET Web API 的路由. 本文着眼于路由进程的详细信息.如 ...

  6. 【Eclipse】总结自己在工作中经常使用到的Eclipse快捷键

    一些我觉得比较有用的快捷键,仅作参考. 1.alt + shift + c :更改方法签名. 2.三次鼠标左键单击: 选中一整行. 3.alt + shift + d/x: 再按t : 运行junit ...

  7. Hide JSP error icons in Eclipse

    down voteaccepted Can can either configure this at workspace level or overwrite at web project level ...

  8. tc674div1b

    题意:给出n个孩子的初始位置,和每个孩子开始的朝向(左或者右),然后孩子的行走规则是,速度始终为1,两人相遇则两人立即转身背向而行. 现在有q次询问,每次问编号为i的孩子在时间t距离原点的距离.返回所 ...

  9. SQL操作记录查看工具

    [1]SQL Server Profiler就是一个Sql的监视工具,可以具体到每一行Sql语句,每一次操作,和每一次的连接 [2] 做数据交互时,往往很难直观的看到最后在数据库中执行的SQL语句.此 ...

  10. Redis学习笔记8--Redis发布/订阅

    发布订阅(pub/sub)是一种消息通信模式,主要的目的是解耦消息发布者和消息订阅者之间的耦合,这点和设计模式中的观察者模式比较相似.pub /sub不仅仅解决发布者和订阅者直接代码级别耦合也解决两者 ...