【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的绝对路径就可以了。

                        

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

  

 1 bool HelloWorld::init()
 2 {
 3     if (!Layer::init())
 4     {
 5         return false;
 6     }
 7     curl_global_init(CURL_GLOBAL_ALL);    //对CURL的全局变量进行初始化
 8     CURL* curl = curl_easy_init();
 9     curl_easy_setopt(curl, CURLOPT_URL, "http://www.baidu.com/");    //设置访问的URL
10     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, info_output);        //设置回调函数用以处理get到的信息
11     CURLcode success = curl_easy_perform(curl);        //返回HTTP请求的状态
12     curl_global_cleanup();            //清除CURL全局变量
13     return true;
14 }
15 size_t HelloWorld::info_output(void* buffer, size_t size, size_t nmemb, void *userp)
16 {
17     CCLOG("============================================================");
18     CCLOG("%s", buffer);
19     CCLOG("============================================================");
20     return 0;
21 }

  运行效果:

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

 1 <?php
 2 
 3 if ( isset($_GET['username']) && isset($_GET['password']) )
 4     echo 'username is '.$_GET['username'].' and password is '.$_GET['password'];
 5 else if ( isset($_POST['username']) && isset($_POST['password']) )
 6     echo 'username is '.$_POST['username'].' and password is '.$_POST['password'];
 7 else
 8     echo 'error';
 9 
10 ?>

  2.客户端:

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

  

 1 bool HelloWorld::init()
 2 {
 3     if (!Layer::init())
 4     {
 5         return false;
 6     }
 7     curl_global_init(CURL_GLOBAL_ALL);    //对CURL的全局变量进行初始化
 8     CURL* curl = curl_easy_init();
 9     //首先使用GET方法发送数据
10     curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/Test/test.php?username=admin&password=123456");
11     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, info_output_get);        //设置回调函数用以处理获取到的信息
12     CURLcode success = curl_easy_perform(curl);        //返回HTTP请求的状态
13     //然后使用POST方法发送数据
14     curl_easy_setopt(curl, CURLOPT_URL, "http://localhost/Test/test.php");
15     curl_easy_setopt(curl, CURLOPT_POST, true);
16     curl_easy_setopt(curl, CURLOPT_POSTFIELDS, "username=admin&password=123456");
17     curl_easy_setopt(curl, CURLOPT_FOLLOWLOCATION, 1L);
18     curl_easy_setopt(curl, CURLOPT_WRITEFUNCTION, info_output_post);        //设置回调函数用以处理获取到的信息
19     success = curl_easy_perform(curl);        //返回HTTP请求的状态
20     curl_global_cleanup();            //清除CURL全局变量
21     return true;
22 }
23 size_t HelloWorld::info_output_get(void* buffer, size_t size, size_t nmemb, void *userp)
24 {
25     CCLOG("===========================GET METHOD============================");
26     CCLOG("%s", buffer);
27     CCLOG("============================================================");
28     return 0;
29 }
30 
31 
32 size_t HelloWorld::info_output_post(void* buffer, size_t size, size_t nmemb, void *userp)
33 {
34     CCLOG("============================POST METHOD=========================");
35     CCLOG("%s", buffer);
36     CCLOG("============================================================");
37     return 0;
38 }

  运行演示:

  可以看到,程序分别使用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 
请尊重别人的劳动成果,让分享成为一种美德,欢迎转载。另外,文章在表述和代码方面如有不妥之处,欢迎批评指正。留下你的脚印,欢迎评论!

posted @ 2016-08-21 09:09  马三小伙儿  阅读(1948)  评论(1编辑  收藏  举报