在上一篇博客中,我们一起学习了如何在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. 什么是pe系统

    Winpe全称 Windows Preinstall Environment,即“Windows 预安装环境”.是一个用于Windows 安装准备的最小操作系统. 基于保护模式下运行Windows X ...

  2. Tp-link TL-WR841N无线路由器端口映射到外网如何设置

    针对TP-LINK的无线路由器进行演示如何设置端口映射和访问控制,演示使用的具体型号是TP-LINK TL-WR841N 3G无线路由器如何设置端口映射. 什么是端口映射? 端口映射又称端口转发,有的 ...

  3. win10如何100%提升网络速度

    1.Win+R运行,输入gpedit.msc 2.依次打开"计算机配置"-"管理模板"-"网络"-"QoS数据包计划程序" ...

  4. 暴力枚举N级子域名

    #!/usr/bin/env python# -*- encoding: utf-8 -*-# A simple and fast sub domains brute tool for pentest ...

  5. PHP用curl伪造IP和来源

    以前没有这么搞过. 今天群里一个朋友在问这个问题. 查了下,CURL确实很强悍的可以伪造IP和来源. 1.php 请求 2.php . 1.php代码: $ch = curl_init(); curl ...

  6. Linux线程同步:条件变量

    条件变量通过允许线程阻塞和等待另一个线程发送信号的方法弥补了互斥锁的不足,它常和互斥锁一起使用.使用时,条件变量被用来阻塞一个线程,当条件不满足时,线程往往解开相应的互斥锁并等待条件发生变化.一旦其它 ...

  7. 【Alpha版本】冲刺总结随笔

    项目预期计划 确定代码规范与编码原则. 根据原型设计,界面设计,搭建应用大致框架,完善控件,背景等的界面设计. 根据体系结构设计,完善界面跳转逻辑,确定功能模块,实现1.0版本功能. 重点完善需求说明 ...

  8. ABAP 数量单位转换

    CALL FUNCTION 'UNIT_CONVERSION_SIMPLE'           EXPORTING             input                = wa_ite ...

  9. NYOJ题目28大数阶乘

    -------------------------------------祭出BigInteger AC代码: import java.math.BigInteger; import java.uti ...

  10. UML大战需求分析——阅读笔记02

    类图是理解面向对象思想的强有力工具,也是业务概念模型分析中最常用的一种UML图.对开发人员来说,并不是对每一个业务流程都很熟练,在客户那里传达过来的需求资料中,有很多术语会把思绪搞晕,他们之间错综复杂 ...