使用CCHttpClient進行cocos2d-x網路程式設計
首先建立一個cocos2d-x專案。
然後我建立了一個網路連線的類,名叫HttpNetConn。其繼承自CCObject,管理網路連線的相應功能。
[cpp] view plaincopyprint?- /*
- * 網路連線模組
- * NetConnect.h
- *
- * Created by fansy [2013-6-30]
- */
- #ifndef _NET_CONNECTION_H_
- #define _NET_CONNECTION_H_
- #include <cocos2d.h>
- USING_NS_CC;
- class NetConnect: public CCObject
- {
- public:
- CREATE_FUNC(NetConnect);
- virtualbool init();
- void getData();
- void httpReqFinished(CCNode* node,CCObject* obj);
- };
- #endif
其中,getData()是向伺服器發請求,httpReqFinished是伺服器響應的應答。
好,接下來,動手實現。
首先,CCHttpClient在extition中,如果你的包含目錄和我一樣,沒有這個,就要在專案屬性->c/c++->附加包含目錄中新增:$(SolutionDir)\extensions 此項(具體位置可能和我的有些不一樣)。並在其NetConnection.cpp的標頭檔案處加上:
- #include "cocos-ext.h"
- #include "../extensions/network/HttpClient.h"
- #include "../extensions/network/HttpRequest.h"
- USING_NS_CC_EXT;
接下來,寫getData函式: [cpp] view plaincopyprint?
- void NetConnect::getData()
- {
- CCHttpClient* httpClient = CCHttpClient::getInstance();
- CCHttpRequest* httpReq =new CCHttpRequest();
- httpReq->setRequestType(CCHttpRequest::kHttpGet);
- httpReq->setUrl("http://www.baidu.com");
- httpReq->setResponseCallback(this,callfuncND_selector(NetConnect::httpReqFinished));
- httpReq->setTag("FirstNet");
- httpClient->setTimeoutForConnect(30);
- httpClient->send(httpReq);
- httpReq->release();
- }
覺得邏輯很清晰,就不細解釋了。然後是回撥函式: [cpp] view plaincopyprint?
- void NetConnect::httpReqFinished( CCNode* node,CCObject* obj )
- {
- CCHttpResponse* response = (CCHttpResponse*)obj;
- if (!response->isSucceed())
- {
- CCLog("Receive Error! %s\n",response->getErrorBuffer());
- return ;
- }
- constchar* 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());
- }
- }
ok,F7編譯。發現缺少庫: [plain] view plaincopyprint?
- 1> NetConnect.cpp
- 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) 中被引用
- 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) 中被引用
- 1>D:\Code\UseLess\HelloCSDN\Debug.win32\HelloCSDN.win32.exe : fatal error LNK1120: 2 個無法解析的外部命令
缺少libExtensions.lib庫,加上。在專案屬性->連結器->附加依賴項中新增:libExtensions.lib。再編譯。
額...似乎還缺:
[plain] view plaincopyprint?- 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 無法解析的外部符號 __imp__pthread_create,該符號在函式 "private: bool __thiscall cocos2d::extension::CCHttpClient::lazyInitThreadSemphore(void)" ([email protected]@[email protected]@@AAE_NXZ) 中被引用
- 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 無法解析的外部符號 __imp__pthread_detach,該符號在函式 "private: bool __thiscall cocos2d::extension::CCHttpClient::lazyInitThreadSemphore(void)" ([email protected]@[email protected]@@AAE_NXZ) 中被引用
- 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 無法解析的外部符號 __imp__pthread_exit,該符號在函式 "void * __cdecl cocos2d::extension::networkThread(void *)" ([email protected]@[email protected]@[email protected]) 中被引用
- 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) 中被引用
- 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 無法解析的外部符號 __imp__pthread_mutex_destroy,該符號在函式 "void * __cdecl cocos2d::extension::networkThread(void *)" ([email protected]@[email protected]@[email protected]) 中被引用
- 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]) 中被引用
- 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]) 中被引用
- 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 無法解析的外部符號 __imp__sem_init,該符號在函式 "private: bool __thiscall cocos2d::extension::CCHttpClient::lazyInitThreadSemphore(void)" ([email protected]@[email protected]@@AAE_NXZ) 中被引用
- 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 無法解析的外部符號 __imp__sem_destroy,該符號在函式 "void * __cdecl cocos2d::extension::networkThread(void *)" ([email protected]@[email protected]@[email protected]) 中被引用
- 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 無法解析的外部符號 __imp__sem_wait,該符號在函式 "void * __cdecl cocos2d::extension::networkThread(void *)" ([email protected]@[email protected]@[email protected]) 中被引用
- 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 無法解析的外部符號 __imp__sem_post,該符號在函式 "private: virtual __thiscall cocos2d::extension::CCHttpClient::~CCHttpClient(void)" ([email protected]@[email protected]@[email protected]) 中被引用
- 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) 中被引用
- 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) 中被引用
- 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) 中被引用
- 1>libExtensions.lib(HttpClient.obj) : error LNK2019: 無法解析的外部符號 __imp__curl_easy_setopt,該符號在函式 "bool __cdecl cocos2d::extension::configureCURL(void *)" ([email protected]@[email protected]@[email protected]) 中被引用
- 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) 中被引用
- 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) 中被引用
- 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?- void HelloWorld::menuCloseCallback(CCObject* pSender)
- {
- // "close" menu item clicked
- //CCDirector::sharedDirector()->end();
- NetConnect* nc = NetConnect::create();
- nc->getData();
- }
執行程式,點選右下角的按鈕。看輸出日誌。打出了我們想要的東西。
=========================================================================
以下內容為本人在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