【Cocos2d-x游戏开发】Cocos2d-x中的弱联网技术
在上一篇博客中,我们一起学习了如何在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中的弱联网技术的更多相关文章
- 【Cocos2d-x游戏开发】Cocos2d-x中的数据存储技术
一.引言 数据存储和网络功能可以说是一款游戏中必不可少的功能,如果一款游戏不能保存进度那么它的可玩性必然大打折扣(试想一下,玩家辛辛苦苦玩了一整天的游戏,结果退出时告诉人家不能保存关卡信息,你明天还得 ...
- iOS cocos2d 2游戏开发实战(第3版)书评
2013是游戏爆发的一年,手游用户也是飞速暴增.虽然自己不做游戏,但也是时刻了解手机应用开发的新动向.看到CSDN的"写书评得技术图书赢下载分"活动,就申请了一本<iOS c ...
- 基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(中)
接<基于Cocos2d-x-1.0.1的飞机大战游戏开发实例(上)> 三.代码分析 1.界面初始化 bool PlaneWarGame::init() { bool bRet = fals ...
- 《MFC游戏开发》笔记六 图像双缓冲技术:实现一个流畅的动画
本系列文章由七十一雾央编写,转载请注明出处. http://blog.csdn.net/u011371356/article/details/9334121 作者:七十一雾央 新浪微博:http:/ ...
- ios游戏开发--cocos2d学习(2)
在第一节中简单介绍了2d项目模板HelloWorld的基础代码,并做了一点小小的改变,像触摸接收.旋转.移动和颜色转变序列CCSequence的使用等等,2d本身封装好了很多方便使用的动作,只需要调用 ...
- ios游戏开发--cocos2d学习(1)
学习cocos2d需要一定的编程基础,最好了解objective-c的语法.至于下载和安装的过程网上有很多,这里不多介绍,直接进入项目的学习. 创建一个cocos2d项目,直接运行,效果如图: 左下角 ...
- ios游戏开发--cocos2d学习(3)
------------继续上一节的内容. “接收触摸事件”: CCLayer类是用来接收触摸输入的.不过你要首先启用这个功能才可以使用它. self.isTouchEnabled = YES;//此 ...
- cocos2d 游戏开发:Cocos2d v3 "hello world"+显示飞船
V3 RC4 版本号图片 显示一个飞船 将Chapter1中 SpaceCargoShip.png 文件 加入到项目里面. 代码在 init : CCSprite *spaceCargoShip = ...
- 【Unity3d游戏开发】Unity3D中的3D数学基础---向量
向量是2D.3D数学研究的标准工具,在3D游戏中向量是基础.因此掌握好向量的一些基本概念以及属性和常用运算方法就显得尤为重要.在本篇博客中,马三就来和大家一起回顾和学习一下Unity3D中那些常用的3 ...
随机推荐
- web前端历史的总结
1.早期的前后一体,前端和后端是一个整体. 2.早期的后端mvc概念,前端只是后端mvc里面的视图层 (laravel就是mvc) 3.ajax技术改变了一切 2004年 Gmail 2005Goog ...
- unity知识点思维导图
写了个思维导图,总结了下学习unity的知识点感觉还有其他很多的没写到,等我慢慢在工作中完善它,这是下面的链接,后续会根据他的每一个细节来丰富我的博客. 详细地址: http://naotu.baid ...
- Bash 中的 _ 是不是环境变量
首先,我们想到的会是 export(等价于 declare -x)命令: $ export | grep 'declare -x _=' 没有找到,那么结论就是 _ 不是环境变量?当然没那么简单,否则 ...
- spark安装(实战)
sparksql+hive :http://lxw1234.com/archives/2015/06/294.htm 1,安装scala http://scala-lang.org/download/ ...
- LOL 控制技能的解释
压制:硬控的一种,是指A在释放压制型技能的时候B无法进行任何动作,可以被 水银腰带 和 坩埚盖 解除(原来可以完全解掉,现在貌似只是能动,伤害还在继续,比如蚱蜢的R中,用水银解掉之后可以立即跑开,但是 ...
- 如何给Apache添加虚拟路径和虚拟主机?
在本地开发,一般只用一个Apache服务器,然后通过配置文件实现多个站点访问,要么是“虚拟路径(别名)”的形式,要么是“虚拟主机”的形式,相关配置参考如下: 说明:我给Apache设置的端口为:,即 ...
- 如何 实现PHP多版本的 共存 和 切换?
编译PHP时指定路径 ./configure --prefix=/opt/php/php-5.6 make && make install 这样可以PHP版本就可以安装到一个特别的路径 ...
- H5案例分享:移动端touch事件判断滑屏手势的方向
移动端touch事件判断滑屏手势的方向 方法一 当开始一个touchstart事件的时候,获取此刻手指的横坐标startX和纵坐标startY: 当触发touchmove事件时,在获取此时手指的横坐标 ...
- java基础 字符串 “==” 和 “equals” 比较
demo: public class TestStringEquals { public static void main(String[] args) { String a = "test ...
- BZOJ 1060: [ZJOI2007]时态同步
Description 一个有根树,你只能进行增加操作,问你将所有叶节点到根的路径权值相同至少需要增加几次. Sol 我也不知道该叫什么算法... 反正就是记录一下到子节点到当前节点的最大距离统计答案 ...