1. 程式人生 > >使用CCHttpClient進行cocos2d-x網路程式設計

使用CCHttpClient進行cocos2d-x網路程式設計

在我使用的cocos2d-x版本(2.1.2)中,已經將curl融進cocos2d-x框架中。下面動手寫個簡單的網路程式。

   首先建立一個cocos2d-x專案。

    然後我建立了一個網路連線的類,名叫HttpNetConn。其繼承自CCObject,管理網路連線的相應功能。

[cpp] view plaincopyprint?
  1. /* 
  2.  * 網路連線模組 
  3.  * NetConnect.h 
  4.  *  
  5.  * Created by fansy [2013-6-30] 
  6.  */
  7. #ifndef _NET_CONNECTION_H_
  8. #define _NET_CONNECTION_H_
  9. #include <cocos2d.h>
  10. USING_NS_CC;  
  11. class NetConnect: public CCObject  
  12. {  
  13. public:  
  14.     CREATE_FUNC(NetConnect);  
  15.     virtualbool init();  
  16.     void getData();  
  17.     void httpReqFinished(CCNode* node,CCObject* obj);  
  18. };  
  19. #endif

    其中,getData()是向伺服器發請求,httpReqFinished是伺服器響應的應答。

    好,接下來,動手實現。

    首先,CCHttpClient在extition中,如果你的包含目錄和我一樣,沒有這個,就要在專案屬性->c/c++->附加包含目錄中新增:$(SolutionDir)\extensions 此項(具體位置可能和我的有些不一樣)。並在其NetConnection.cpp的標頭檔案處加上:

[cpp] view plaincopyprint?
  1. #include "cocos-ext.h"
  2. #include "../extensions/network/HttpClient.h"
  3. #include "../extensions/network/HttpRequest.h"
  4. USING_NS_CC_EXT;  

    接下來,寫getData函式: [cpp] view plaincopyprint?
  1. void NetConnect::getData()  
  2. {  
  3.     CCHttpClient* httpClient = CCHttpClient::getInstance();  
  4.     CCHttpRequest* httpReq =new CCHttpRequest();  
  5.     httpReq->setRequestType(CCHttpRequest::kHttpGet);  
  6.     httpReq->setUrl("http://www.baidu.com");  
  7.     httpReq->setResponseCallback(this,callfuncND_selector(NetConnect::httpReqFinished));  
  8.     httpReq->setTag("FirstNet");  
  9.     httpClient->setTimeoutForConnect(30);  
  10.     httpClient->send(httpReq);  
  11.     httpReq->release();  
  12. }  

    覺得邏輯很清晰,就不細解釋了。然後是回撥函式: [cpp] view plaincopyprint?
  1. void NetConnect::httpReqFinished( CCNode* node,CCObject* obj )  
  2. {  
  3.     CCHttpResponse* response = (CCHttpResponse*)obj;  
  4.     if (!response->isSucceed())  
  5.     {  
  6.         CCLog("Receive Error! %s\n",response->getErrorBuffer());  
  7.         return ;   
  8.     }  
  9.     constchar* tag = response->getHttpRequest()->getTag();  
  10.     if ( 0 == strcmp("FirstNet",tag))  
  11.     {  
  12.         std::vector<char> *data = response->getResponseData();  
  13.         int data_length =  data->size();  
  14.         std::string res;  
  15.         for (int i = 0;i<data_length;++i)  
  16.         {  
  17.             res+=(*data)[i];  
  18.         }  
  19.         res+='\0';  
  20.         CCLog("%s",res.c_str());  
  21.     }  
  22. }  

    ok,F7編譯。發現缺少庫: [plain] view plaincopyprint?
  1. 1>  NetConnect.cpp  
  2. 1>NetConnect.obj : error LNK2019: 無法解析的外部符號 "public: static class cocos2d::extension::CCHttpClient * __cdecl cocos2d::extension::CCHttpClient::getInstance(void)" ([email protected]@[email protected]@@[email protected]),該符號在函式 "public: void __thiscall NetConnect::getData(void)" ([email protected]@@QAEXXZ) 中被引用  
  3. 1>NetConnect.obj : error LNK2019: 無法解析的外部符號 "public: void __thiscall cocos2d::extension::CCHttpClient::send(class cocos2d::extension::CCHttpRequest *)" ([email protected]@[email protected]@@[email protected]@@Z),該符號在函式 "public: void __thiscall NetConnect::getData(void)" ([email protected]@@QAEXXZ) 中被引用  
  4. 1>D:\Code\UseLess\HelloCSDN\Debug.win32\HelloCSDN.win32.exe : fatal error LNK1120: 2 個無法解析的外部命令  

   缺少libExtensions.lib庫,加上。在專案屬性->連結器->附加依賴項中新增:libExtensions.lib。再編譯。

    額...似乎還缺:

[plain] view plaincopyprint?
  1. 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 無法解析的外部符號 __imp__pthread_create,該符號在函式 "private: bool __thiscall cocos2d::extension::CCHttpClient::lazyInitThreadSemphore(void)" ([email protected]@[email protected]@@AAE_NXZ) 中被引用  
  2. 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 無法解析的外部符號 __imp__pthread_detach,該符號在函式 "private: bool __thiscall cocos2d::extension::CCHttpClient::lazyInitThreadSemphore(void)" ([email protected]@[email protected]@@AAE_NXZ) 中被引用  
  3. 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 無法解析的外部符號 __imp__pthread_exit,該符號在函式 "void * __cdecl cocos2d::extension::networkThread(void *)" ([email protected]@[email protected]@[email protected]) 中被引用  
  4. 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 無法解析的外部符號 __imp__pthread_mutex_init,該符號在函式 "private: bool __thiscall cocos2d::extension::CCHttpClient::lazyInitThreadSemphore(void)" ([email protected]@[email protected]@@AAE_NXZ) 中被引用  
  5. 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 無法解析的外部符號 __imp__pthread_mutex_destroy,該符號在函式 "void * __cdecl cocos2d::extension::networkThread(void *)" ([email protected]@[email protected]@[email protected]) 中被引用  
  6. 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 無法解析的外部符號 __imp__pthread_mutex_lock,該符號在函式 "private: void __thiscall cocos2d::extension::CCHttpClient::dispatchResponseCallbacks(float)" ([email protected]@[email protected]@@[email protected]) 中被引用  
  7. 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 無法解析的外部符號 __imp__pthread_mutex_unlock,該符號在函式 "private: void __thiscall cocos2d::extension::CCHttpClient::dispatchResponseCallbacks(float)" ([email protected]@[email protected]@@[email protected]) 中被引用  
  8. 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 無法解析的外部符號 __imp__sem_init,該符號在函式 "private: bool __thiscall cocos2d::extension::CCHttpClient::lazyInitThreadSemphore(void)" ([email protected]@[email protected]@@AAE_NXZ) 中被引用  
  9. 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 無法解析的外部符號 __imp__sem_destroy,該符號在函式 "void * __cdecl cocos2d::extension::networkThread(void *)" ([email protected]@[email protected]@[email protected]) 中被引用  
  10. 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 無法解析的外部符號 __imp__sem_wait,該符號在函式 "void * __cdecl cocos2d::extension::networkThread(void *)" ([email protected]@[email protected]@[email protected]) 中被引用  
  11. 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 無法解析的外部符號 __imp__sem_post,該符號在函式 "private: virtual __thiscall cocos2d::extension::CCHttpClient::~CCHttpClient(void)" ([email protected]@[email protected]@[email protected]) 中被引用  
  12. 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 無法解析的外部符號 __imp__curl_slist_append,該符號在函式 "int __cdecl cocos2d::extension::processGetTask(class cocos2d::extension::CCHttpRequest *,unsigned int (__cdecl*)(void *,unsigned int,unsigned int,void *),void *,int *)" ([email protected]@[email protected]@[email protected]@[email protected]@Z) 中被引用  
  13. 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 無法解析的外部符號 __imp__curl_slist_free_all,該符號在函式 "int __cdecl cocos2d::extension::processGetTask(class cocos2d::extension::CCHttpRequest *,unsigned int (__cdecl*)(void *,unsigned int,unsigned int,void *),void *,int *)" ([email protected]@[email protected]@[email protected]@[email protected]@Z) 中被引用  
  14. 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 無法解析的外部符號 __imp__curl_easy_init,該符號在函式 "int __cdecl cocos2d::extension::processGetTask(class cocos2d::extension::CCHttpRequest *,unsigned int (__cdecl*)(void *,unsigned int,unsigned int,void *),void *,int *)" ([email protected]@[email protected]@[email protected]@[email protected]@Z) 中被引用  
  15. 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 無法解析的外部符號 __imp__curl_easy_setopt,該符號在函式 "bool __cdecl cocos2d::extension::configureCURL(void *)" ([email protected]@[email protected]@[email protected]) 中被引用  
  16. 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 無法解析的外部符號 __imp__curl_easy_perform,該符號在函式 "int __cdecl cocos2d::extension::processGetTask(class cocos2d::extension::CCHttpRequest *,unsigned int (__cdecl*)(void *,unsigned int,unsigned int,void *),void *,int *)" ([email protected]@[email protected]@[email protected]@[email protected]@Z) 中被引用  
  17. 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 無法解析的外部符號 __imp__curl_easy_cleanup,該符號在函式 "int __cdecl cocos2d::extension::processGetTask(class cocos2d::extension::CCHttpRequest *,unsigned int (__cdecl*)(void *,unsigned int,unsigned int,void *),void *,int *)" ([email protected]@[email protected]@[email protected]@[email protected]@Z) 中被引用  
  18. 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 無法解析的外部符號 __imp__curl_easy_getinfo,該符號在函式 "int __cdecl cocos2d::extension::processGetTask(class cocos2d::extension::CCHttpRequest *,unsigned int (__cdecl*)(void *,unsigned int,unsigned int,void *),void *,int *)" ([email protected]@[email protected]@[email protected]@[email protected]@Z) 中被引用  

    再按之前的方法加入:libcurl_imp.lib、pthreadVCE2.lib 這兩個庫。再編譯,走你。

    終於行了。

    接下來把它加到程式中。先在HelloWorldScene中加入NetConnect.h標頭檔案。我更改了右下角的那個CCMenuItem的響應。

[cpp] view plaincopyprint?
  1. void HelloWorld::menuCloseCallback(CCObject* pSender)  
  2. {  
  3.     // "close" menu item clicked
  4.     //CCDirector::sharedDirector()->end();
  5.     NetConnect* nc = NetConnect::create();  
  6.     nc->getData();  
  7. }  

    執行程式,點選右下角的按鈕。看輸出日誌。打出了我們想要的東西。


=========================================================================

以下內容為本人在win7 64位 + vs2012 + cocos2d-x-3.2下的實踐版本

先宣告下:這個專案需要用到libNetwork.lib庫,但是這個檔案預設不存在,但是有相應的庫專案,新增進來即可(路徑:cocos2d\cocos\network\proj.win32\libNetwork.vcxproj),如圖:

NetConnect.h

#ifndef __NET_CONNECT_H__
#define __NET_CONNECT_H__

#pragma once

#include <cocos2d.h>

USING_NS_CC;

class NetConnect : public CCObject
{
public:
	CREATE_FUNC(NetConnect);  

	virtual bool init();
	void getData();
	void httpReqFinished(CCNode* node, void* obj);
};

#endif


NetConnect.cpp
#include <cocos/network/HttpClient.h>
#include <cocos/network/HttpRequest.h>
#include "NetConnect.h"

using namespace network;

void writeFile(const char* fname, const std::string &str)
{
	FILE *fp = fopen(fname, "wb");
	if(fp)
	{
		fwrite(str.c_str(), str.size(), 1, fp);
		fclose(fp);
		CCLog("write file successful");
	}
	else
		CCLog("can not open file for write");
}

bool NetConnect::init()
{
	return true;
}

void NetConnect::getData()
{
	HttpClient* httpClient = HttpClient::getInstance();
	HttpRequest* httpReq = new HttpRequest();

	httpReq->setRequestType(HttpRequest::Type::GET);
	httpReq->setUrl("http://www.baidu.com");
	httpReq->setResponseCallback(this, callfuncND_selector(NetConnect::httpReqFinished));
	httpReq->setTag("FirstNet");
	httpClient->setTimeoutForConnect(30);
	httpClient->send(httpReq);

	httpReq->release();
}

void NetConnect::httpReqFinished( CCNode* node, void* obj )
{
	HttpResponse* response = (HttpResponse*)obj;
	if (!response->isSucceed())
	{
		CCLog("Receive Error! %s\n", response->getErrorBuffer());
		return ;
	}

	const char* tag = response->getHttpRequest()->getTag();
	if ( 0 == strcmp("FirstNet", tag))
	{
		std::vector<char> *data = response->getResponseData();
		int data_length = data->size();
		std::string res;
		for (int i = 0; i < data_length; ++i)
		{
			res += (*data)[i];
		}
		res += '\0';
		CCLog("%s", res.c_str());
		writeFile("baidu.html", res);
	}
}

同時修改HelloWorld::init(),使其呼叫我們建立的這個NetConnect類:

bool HelloWorld::init()
{
    //////////////////////////////
    // 1. super init first
    if ( !Layer::init() )
    {
        return false;
    }
    
    Size visibleSize = Director::getInstance()->getVisibleSize();
    Vec2 origin = Director::getInstance()->getVisibleOrigin();

    /////////////////////////////
    // 2. add a menu item with "X" image, which is clicked to quit the program
    //    you may modify it.

    // add a "close" icon to exit the progress. it's an autorelease object
    auto closeItem = MenuItemImage::create(
                                           "CloseNormal.png",
                                           "CloseSelected.png",
                                           CC_CALLBACK_1(HelloWorld::menuCloseCallback, this));
    
	closeItem->setPosition(Vec2(origin.x + visibleSize.width - closeItem->getContentSize().width/2 ,
                                origin.y + closeItem->getContentSize().height/2));

    // create menu, it's an autorelease object
    auto menu = Menu::create(closeItem, NULL);
    menu->setPosition(Vec2::ZERO);
    this->addChild(menu, 1);

    /////////////////////////////
    // 3. add your codes below...

    // add a label shows "Hello World"
    // create and initialize a label
    
    auto label = LabelTTF::create("Hi, JoeBlack", "Arial", 44);
    
    // position the label on the center of the screen
    label->setPosition(Vec2(origin.x + visibleSize.width/2,
                            origin.y + visibleSize.height - label->getContentSize().height));

    // add the label as a child to this layer
    this->addChild(label, 1);

    // add "HelloWorld" splash screen"
    auto sprite = Sprite::create("HelloWorld.png");

    // position the sprite on the center of the screen
    sprite->setPosition(Vec2(visibleSize.width/2 + origin.x, visibleSize.height/2 + origin.y));

    // add the sprite as a child to this layer
    this->addChild(sprite, 0);
    
	NetConnect *netConn = NetConnect::create();
	netConn->getData();

    return true;
}


專案庫的依賴關係如下圖:


專案的標頭檔案include路徑新增"..\cocos2d",因為編譯時的當前目錄為解決方案(即*.sln)所在路徑

再手工新增一個依賴庫檔案:libcurl_imp.lib,如圖:

編譯執行(F5或Ctrl+F5)後,將會在"Resources"下生成一個baidu.html檔案(同時也說明程式執行時當前路徑是Resources),雙擊該檔案即可看到相應網頁,也可通過編輯器檢視其文字。

相關推薦

使用CCHttpClient進行cocos2d-x網路程式設計

在我使用的cocos2d-x版本(2.1.2)中,已經將curl融進cocos2d-x框架中。下面動手寫個簡單的網路程式。    首先建立一個cocos2d-x專案。     然後我建立了一個網路連線的類,名叫HttpNetConn。其繼承自CCObject,管理網路連

C/C++ 用libcurl庫進行http通訊網路程式設計

五、libcurl使用的HTTP訊息頭     當使用libcurl傳送http請求時,它會自動新增一些http頭。我們可以通過CURLOPT_HTTPHEADER屬性手動替換、新增或刪除相應 的HTTP訊息頭。     Host     http1.1(大部分http1.0)版本都要求客戶端請求提供這個資

C++用libcurl庫進行http通訊網路程式設計

//採用CURLOPT_RESUME_FROM_LARGE 實現檔案斷點續傳功能 #include <stdlib.h> #include <stdio.h> #include <sys/stat.h> #include <curl/curl.h> //這個

使用netty進行客戶端網路程式設計及斷線重連功能實現

       不管做哪個方向開發,都會有那麼一兩個牛B閃閃的庫,可以極大的方便開發,比如java網路程式設計中的netty庫。無論客戶端還是服務端網路程式設計,netty基本都是首選網路庫,健壯、高效、穩定,並且已經得到很多商業專案驗證。        當用netty進行客

[原始碼和文件分享]分別基於WIN32 API介面程式設計Cocos2d-x實現的兩個版本FlappyBird遊戲

1 開發背景 遊戲程式設計涉及了學科中的各個方面,鑑於目的在於學習與進步,本遊戲《Flappy Bird 》採用了兩個不同的開發方式來開發本款遊戲,一類直接採用win32底層API來實現,另一類採用當前火熱的cocos2d-x遊戲引擎來開發本遊戲。 2 需求分析 2.1 資料分析 本

利用Python進行socket網路程式設計,實現樹莓派與Ubuntu(16.04)之間的簡單的網路聊天

標題 目標: 採用socket程式設計,完成兩個樹莓派之間、或者樹莓派與Ubuntu系統之間的網路文字通訊(或聊天) 分析: 首先我們需要了解socket程式設計的原理以及它是怎麼實現的。 Socket的英文原義是“孔”或“插座”。作為BSD UNIX的程序通訊機制,取後一種意思。

Android 網路程式設計(5): OkHttp2.x用法全解析

前言 講完了Volley,我們接下來看看目前比較火的網路框架OkHttp, 它處理了很多網路疑難雜症:會從很多常用的連線問題中自動恢復。如果您的伺服器配置了多個IP地址,當第一個IP連線失敗的時候,OkHttp會自動嘗試下一個IP,此外OkHttp還處理了代理伺服器問題和SS

cocos2d-x 如何使用CCProgressTimer作為血條,實現跟隨怪物進行移動,自動掉血,然後死亡。

1、如何使用CCProgressTimer  2、如何跟隨怪物  3、如何掉血和死亡  4、結構層次。  //注意加紅色部分 樣例程式碼如下: 怪物的定義: class Enemy :public CCSprite { public:     Enemy(CCPoint

cocos2d-x 跨平臺Socket網路模組

相信很多人都找,但網上給出的答案又覺得看不懂。其實就是使用bsd socket.但這個只能在linux下面使用,而在window是無法使用的。所以我們要封裝一下。 #ifndef __CSocket__ #define __CSocket__ #if CC_TARGE

Android 通過WebService進行網路程式設計,使用工具類輕鬆實現

相信大家在平常的開發中,對網路的操作用到HTTP協議比較多,通過我們使用Get或者Post的方法呼叫一個數據介面,然後伺服器給我們返回JSON格式的資料,我們解析JSON資料然後展現給使用者,相信很多人很喜歡伺服器給我們返回JSON資料格式,因為他解析方便,也有一些JSON的

如何基於TCP/IP協議進行MFC Socket網路通訊程式設計

MFC Socket網路通訊程式設計        最近因為一個專案需要進行區域網絡通訊,向工作單位的軟體工程師請教了一下需要用到哪些知識,然後博主就自學了一遍windows網路通訊程式設計原理,然後就在網上找了一大堆例子,但實際執行效果並不佳,花了大概一週多的時間總算是把

Java 網路程式設計(五) 使用TCP/IP的套接字(Socket)進行通訊

使用TCP/IP的套接字(Socket)進行通訊 套接字Socket的引入   為了能夠方便地開發網路應用軟體,由美國伯克利大學在Unix上推出了一種應用程式訪問通訊協議的作業系統用呼叫socket(套接字)。   socket的出現,使程式設計師可以很方便地訪問TCP/

iOS開發之網路程式設計--1、AFNetwork 3.x 的所有開發中常用基礎介紹

前言:第三方網路請求框架中AFNetwork 3.x收歡迎程度相當高的: 由於iOS 7 和 Mac OS X 10.9 Mavericks 中一個顯著的變化就是對 Foundation URL 載入系統的徹底重構。而且現在AFN 3.x版本 完全摒棄了NSURLConnection,而使用了NSURL

自己關於Android 通過WebService進行網路程式設計的總結

          平時在開發中,都是使用http協議傳送get或post方法,得到一個json的字串,然後解析封裝。          但是今天遇到一個專案,是使用android去呼叫WebService介面來獲取資料,得到的是一個xml的字串並對其進行封裝。這裡就遇

網路程式設計(55)—— Windows下使用WSASocket基於Completion Routine進行IO重疊

一、引言         上一文中我們介紹了使用基於事件進行IO重疊的方法,本文主要介紹另外一種,基於回撥函式void CALLBACK CompletionRoutine(DWORD dwError,DWORDszRecvBytes,LPWSAOVERLAPPED lpO

網路程式設計通過tcp協議進行聊天對話

網路程式設計 自從網際網路誕生以來,現在基本上所有的程式都是網路程式,很少有單機版的程式了。 計算機網路就是把各個計算機連線到一起,讓網路中的計算機可以互相通訊。網路程式設計就是如何在程式中實現兩臺計算機的通訊。 網路程式設計對所有開發語言都是一樣的,Py

網路程式設計(40)—— 使用訊號量semaphore進行多程序間的同步

        本文主要介紹下在多程序中使用訊號量semaphore的方法。在上一文中,我們已經知道semaphore和mutex對臨界區訪問控制的一個最主要區別就是semaphore可以跨程序使用,而mutex只能在一個程序中使用。我們再來看下sem_init的原型,熟悉

網路程式設計之編寫LSP進行Winsock API監控攔截或LSP注入

【1】工具介紹:用到的工具:VS2015 語言:C/C++ 需要系統提供的動態連結庫:1、 sporder.dll //很多系統不自帶著個dll,導致編譯時缺少dll無法編譯. (釋出時必須將此dll放到程式目錄) 本人只提供: WIN7 64位的sporder.d

[寒江孤葉丶的Cocos2d-x之旅_34]ODSocket(BSDSocket)如何在切換網路狀態時自動重連

原創文章,歡迎轉載,轉載請註明:文章來自[寒江孤葉丶的Cocos2d-x之旅系列] 用於監聽IOS網路狀態切換(WIFI和移動蜂窩網路) 有什麼作用 在Socket網路遊戲中,經常會用到BSDSocket。使用者切換網路狀態時,Socket連結

網路程式設計進行客戶端和伺服器的連線

網路程式設計 自從網際網路誕生以來,現在基本上所有的程式都是網路程式,很少有單機版的程式了。計算機網路就是把各個計算機連線到一起,讓網路中的計算機可以互相通訊。網路程式設計就是如何在程式中實現兩臺計算機的通訊。網路程式設計對所有開發語言都是一樣的,Python也不例外。用Py