http://www.cnblogs.com/msxh/p/5790767.html
php
在上一篇博客中,咱們一塊兒學習瞭如何在Cocos2d-x中存儲數據和讀取信息,本篇博客咱們將一塊兒討論和數據存儲一樣重要的聯網技術。html
1、弱聯網技術介紹c++
在網絡遊戲中許多重要的功能都須要網絡鏈接,而根據須要的不一樣,這些鏈接大致可分爲弱聯網和強聯網兩種。好比,在《微信飛機大戰》或者《開心消消樂》這類的遊戲中,玩家在本地進行遊戲,只有最後纔會上傳成績到服務器進行排名或者將成績分享。這樣數據量和頻率都比較低的網絡通訊就可使用弱聯網技術。而在一些須要實時對話或者處理大量的數據的遊戲中弱聯網就再也不適合,須要使用強聯網技術了。git
通常來講,弱聯網技術都採用了某種web方式經過HTTP協議來傳輸數據,而強聯網技術則經過Socket的方式由開發者根據須要來制定某種協議進行通訊。github
2、經過HTTP協議獲取網站信息web
在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()方法作清理工做,不然會形成沒必要要的資源佔用。
3、經過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
請尊重別人的勞動成果,讓分享成爲一種美德,歡迎轉載。另外,文章在表述和代碼方面若有不妥之處,歡迎批評指正。留下你的腳印,歡迎評論!