【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 
請尊重別人的勞動成果,讓分享成為一種美德,歡迎轉載。另外,文章在表述和代碼方面如有不妥之處,歡迎批評指正。留下你的腳印,歡迎評論!


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM