【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 ...
随机推荐
- 第二轮冲刺-Runner站立会议06
今天:解决连接问题 明天:编写日历界面 困难:暂无
- global name 'validate_on_submit' is not defined错误
原因就是validate_on_submit()方法是属于form的方法我使用的时候忘了form. 还有一个比较重要的是validate_on_submit()方法是wtf特有的而wtform是没有这 ...
- [Unity3d]调试问题之UI/Image不显示
问题描述 在项目中添加的UI/Image资源,在PC和通过Unity Remove测试都没有问题: PC上的效果 手机上Unity Remove测试结果 可真正发布到手机上运行则如下显示,说明imag ...
- [Unity] 在协程中等待指定的毫秒
先写一个静态类: /// <summary> /// 公用基础函数库 /// <remarks>作者: YangYxd</remarks> /// </sum ...
- Python SMTP邮件模块
SMTP是发送邮件的协议,Python内置对SMTP的支持,可以发送纯文本邮件.HTML邮件以及带附件的邮件. Python对SMTP支持有smtplib和email两个模块,email负责构造邮件, ...
- win32 disk imager使用后u盘容量恢复
XP下进入CMD命令窗体,Vista及7下右键以管理员方式运行DOS窗体 输入DISKPART,会显示计算机名,及DISKPART>命令行 在此状态下输入LIST DISK查看机器磁盘,正常Di ...
- Spring中配置和读取多个Properties文件--转
public class PropertiesFactoryBeanextends PropertiesLoaderSupportimplements FactoryBean, Initializin ...
- [Network] HTML、XML和JSON学习汇总
写在前面:楼主也是刚刚接触这方面的知识,之前完全是零基础,后来经朋友推荐了几个不错的博文,看完以后豁然开朗.但是此博文更加偏重于基础知识介绍(其实更深的楼主也还不了解,这方面的大神请绕道),只是分享个 ...
- C#高级编程笔记 Day 8, 2016年9月 28日 (数组)
1.数组的初始化 声明了数组后,就必须为数组分配内存,以保存数组的所有元素.数组是引用类型,所以必须给它分配堆上的内存,为此,应使用 new 运算符,指定数组中元素的类型和数量来初始化数组的变量.若使 ...
- 用python修改haproxy配置文件
需求: 当用户输入域名的时候,显示出来下面的记录 当用户需要输入添加纪录的时候,添加到你需要的那个域名下面 global log 127.0.0.1 local2 daemon maxconn 256 ...