coco2dx c++ HTTP实现

coco2dx c++ HTTP实现 

达到的结果如下面的

iPhone截图

android 日志截图

流程图例如以下

功能主要通过CURL c pthread 实现 我实现的不是多线程断点(假设要实现能够依据我这个进行加入任务序列,可參考 cocos2d-x 中AssetsManager的实现,事实上我的部分也是參考这个写的 为什么写这个呢 原因就是 AssetsManager是不支持断点续传的)

博客地址:http://blog.csdn.net/vpingchangxin/article/details/22309067

详细能够去CURL官网或者找资料科普一下

PS:假设是版本号公布最后设置超时时间20秒左右否则下载会占用很多其它下载实现效率等问题 我是为了測试 设置超时时间为2秒

1.先创建一个界面进行控制进行下载、停止、删除、进度 并绑定事件

2.在进行下载中开一个线程进行下载 (由于牵涉到UI,不开线程UI会卡着阻塞UI线程直到下载完毕)以下是事件中的控制 HelloWorldSecene.cpp中的实现

void HelloWorld::menuCallback(CCObject* pSender) {CCMenuItem *item = (CCMenuItem *)pSender;switch (item->getTag()) {case 1: // down startCCDirector::sharedDirector()->getScheduler()->scheduleSelector(schedule_selector(HelloWorld::updateUI), this, 0, false); // HttpClient中參考isStop = false;this->threadStart();break;case 2: // down stopisStop = true;break;case 3:if (isStop) {CCLog("downFilePath:%s",downFilePath.c_str());if (access(downFilePath.c_str(), 0) == 0) {remove(downFilePath.c_str());CCMessageBox("删除成功", "温馨提示");}else{CCMessageBox("没有找到文件文件夹", "温馨提示");}}else{CCMessageBox("下载中或没有文件下载", "温馨提示");}break;default:break;}
}

3。

实现线程类并回调设置

// 启动线程的方法
int HelloWorld::threadStart() {pthread_mutex_init(&g_downloadMutex, NULL);int errCode=0;pthread_t th_curlDown; // 线程初始化do {pthread_attr_t tAttr;errCode=pthread_attr_init(&tAttr);CC_BREAK_IF(errCode!=0);errCode=pthread_attr_setdetachstate(&tAttr, PTHREAD_CREATE_DETACHED);if(errCode!=0) {pthread_attr_destroy(&tAttr);break;}errCode=pthread_create(&th_curlDown, &tAttr, thread_funcation, this);} while (0);return errCode;
}// 须要线程来完毕的功能都写在这个函数里
void* HelloWorld::thread_funcation(void *arg) {CCLOG("thread started...");HelloWorld *hw = (HelloWorld*)arg;hw->ccc = new CurlDown("http://developer.baidu.com/map/static/doc/output/BaiduMap_AndroidSDK_v2.4.0_All.zip",hw->downFilePath);//    ccc->mDownloadUrl = "http://developer.baidu.com/map/static/doc/output/BaiduMap_AndroidSDK_v2.4.0_All.zip";//    int leng = ccc->getDownloadFileLenth();hw->ccc->setDelegate(hw);hw->ccc->downloadControler();return NULL;
}

4.实现回调进度、成功、错误(里面用到线程锁对数据进度更新UI,本来对线程就不熟悉,问了群里面的大牛,看了不少资料)

void HelloWorld::onError(CurlDown::ErrorCode errorCode){CCLog("error");pthread_mutex_lock(&g_downloadMutex);updateStr = "error";pthread_mutex_unlock(&g_downloadMutex);CCDirector::sharedDirector()->getScheduler()->unscheduleSelector(schedule_selector(HelloWorld::updateUI), this);
}
void HelloWorld::onProgress(double percent, void *delegate, string filefullPath){ // 下载进度CCLog("donw progress:%.2f%%",percent);if (isStop) {CurlDown * cd = (CurlDown *)delegate;//        pthread_mutex_lock(&g_downloadMutex);cd->setStopDown();//        pthread_mutex_unlock(&g_downloadMutex);}pthread_mutex_lock(&g_downloadMutex);const char * per =CCString::createWithFormat("donw progress:%.2f%%",percent)->getCString();updateStr = per;downFilePath = filefullPath;pthread_mutex_unlock(&g_downloadMutex);
}
void HelloWorld::onSuccess(string filefullPath){CCLog("success");pthread_mutex_lock(&g_downloadMutex);updateStr = "success";downFilePath = filefullPath;pthread_mutex_unlock(&g_downloadMutex);
}

5.CurlDown.h CurlDown.cpp类实现 (能够直接抽取出来用于不论什么地方。没有牵涉到cocos2d-x部分,cocos2d-x 部分能够删除没关系)

1)对类初始化

static pthread_mutex_t g_downloadMutex_1;CurlDown::~CurlDown(){mFileLenth = 0;
}
CurlDown::CurlDown():isStop(false),mDownloadUrl(""),timeout(2){ // test timeout 2 seconds. if release timeout 20 secondsmFileLenth = 0;mFilePath = "";pthread_mutex_init(&g_downloadMutex_1, NULL);
}
CurlDown::CurlDown(string downUrl,string filePath):mFileLenth(0),isStop(false),mDownloadUrl(downUrl),timeout(2),mFilePath(filePath){  // test timeout 2 seconds. if release timeout 20 secondsmDownloadUrl = downUrl;pthread_mutex_init(&g_downloadMutex_1, NULL);
}void CurlDown::setDelegate(CurlDownDelegate * delegate) {mDelegate = delegate;
}

2)控制下载方法

void CurlDown::downloadControler() {CCLog("--1-");mFileLenth = getDownloadFileLenth(); // 获取远程文件大小if (mFileLenth <= 0) {cout << "download file fail..." << endl;mDelegate->onError(kNetwork);return;}vector<string> searchPaths = CCFileUtils::sharedFileUtils()->getSearchPaths();vector<string>::iterator iter = searchPaths.begin();searchPaths.insert(iter, mFilePath);CCFileUtils::sharedFileUtils()->setSearchPaths(searchPaths);CCLog("--2-mFileLenth:%f",mFileLenth);mFileName = mDownloadUrl.substr(mDownloadUrl.rfind('/') + 1);CCLog("--3-");CCLog("mFileName:%s;",mFileName.c_str());
//    mFilePath = CCFileUtils::sharedFileUtils()->getWritablePath();
//    CCLog("--5-");mFilePath = mFilePath + mFileName;CCLog("mFilePath:%s",mFilePath.c_str());CCLog("--6-");bool ret = false;while (true){ // 循环下载 每30秒进行下载 避免断网情况ret = download(); //直接下载 进行阻塞线程CCLog("----stop---%s------",isStop?"true":"false");if (isStop) { // 假设进行停止 breakCCLog("----stop---------");break;}if (ret ){ //下载完毕break;}sleep(0.5); //每次下载中间间隔0.5秒}if (ret) {CCLog("download ok");mDelegate->onSuccess(mFilePath);} else {CCLog("download fail");mDelegate->onError(kUncompress);}
}

3)核心下载

#pragma mark 进行下载
bool CurlDown::download() {FILE *fp = NULL;if(access(mFilePath.c_str(), 0)==0) { // 以二进制形式追加fp = fopen(mFilePath.c_str(), "ab+");} else { // 二进制写fp = fopen(mFilePath.c_str(), "wb");}if (fp == NULL) {// 假设文件初始化失败进行返回return false;}// 读取本地文件下载大小long localFileLenth = getLocalFileLength(); //已经下载的大小CCLog("filePath:%s。leng:%ld",mFilePath.c_str() , localFileLenth ); //4397779 //3377875CURL *handle = curl_easy_init();std::string packageUrl = mDownloadUrl; //下载地址+下载文件名称curl_easy_setopt(handle, CURLOPT_URL, packageUrl.c_str()); // http://curl.haxx.se/libcurl/c/fopen.htmlcurl_easy_setopt(handle, CURLOPT_TIMEOUT, timeout);curl_easy_setopt(handle, CURLOPT_WRITEFUNCTION, my_write_func);   //写文件回调方法curl_easy_setopt(handle, CURLOPT_WRITEDATA, fp); // 写入文件对象curl_easy_setopt(handle, CURLOPT_RESUME_FROM, localFileLenth);  // 从本地大小位置进行请求数据//    curl_easy_setopt(handle, CURLOPT_RESUME_FROM_LARGE, localFileLenth); // 坑curl_easy_setopt(handle, CURLOPT_NOPROGRESS, 0L);curl_easy_setopt(handle, CURLOPT_PROGRESSFUNCTION, my_progress_func ); //下载进度回调方法curl_easy_setopt(handle, CURLOPT_PROGRESSDATA, this); // 传入本类对象CURLcode res = curl_easy_perform(handle);fclose(fp);return res == CURLE_OK;
}

以下大家要问道的就是求源代码(^..^)源代码已经上传github https://github.com/pingchangxin/BPDownload cesd 下载位置:http://download.csdn.net/detail/vpingchangxin/7108649

我就不再这里mac她跑到隔壁 windows在没有运行(至win繁琐的头痛的结构)

转载于:https://www.cnblogs.com/hrhguanli/p/4573005.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/431690.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

常量池在堆还是方法区_第九章_方法区

方法区栈、堆、方法区的交互关系这次所讲述的是运行时数据区的最后一个部分——方法区从线程共享与否的角度来看ThreadLocal&#xff1a;如何保证多个线程在并发环境下的安全性&#xff1f;典型应用就是数据库连接管理&#xff0c;以及会话管理栈、堆、方法区的交互关系下面就涉…

html a 点击防止刷新,a标签点击跳转页面不刷新的问题

作为一位前端新手,刚接触移动端开发不久,遇到的问题真的是一个接着一个...前面写好了几个页面,今天试着将各个页面的链接打通,然后问题就来了...(╯︵╰)这里看一下原来想要实现的两个页面跳转的效果--点击图一标注的栏目可以跳转到一个新的页面图二...按照之前写a标签的跳转链…

不显示表头_技术干货 | 基于数模混合型SoC实现的两线制高精度无源表头方案

摘要&#xff1a;针对传统的两线制表头在高低温环境下测量精度差、温漂大的特点&#xff0c;现提出一种可满足高低温环境使用需求的两线制高精度数显表头设计方案&#xff0c;此方案在高低温环境下测量精度高、工作稳定、抗干扰能力强。引言随着仪表技术和低功耗技术的发展&…

python gui开发_python 开发GUI应用之Dabo

这几天在研究用python开发GUI应用程序&#xff0c;首先选择了wxpython&#xff0c;英文书籍wxpython in action是不错的&#xff0c;网上也有中文版。 在win7下安装python2.7&#xff0c;wxpython2.8.12.1,来个HelloWorld&#xff0c;照着教程一点不成问题。 我为了能够快速开发…

计算机网络安装系统怎么办,电脑没有网络如何重装系统

大家应该在线重装系统的时候安装下载到一半会提示您没有网络了&#xff0c;需要用户怎么解决呢&#xff1f;无法联网可以重装系统吗&#xff1f;下面让小编带您了解一下无网环境下重装系统的教程操作哦&#xff01;1&#xff0c;在其他可联网的电脑上&#xff0c;使用小白一键重…

用计算机桁架各杆内力,运用AUTO CAD求解桁架内力?

摘要&#xff1a; 一个平面汇交力系的平衡条件是其力多边形必须闭合,依其条件,利用图解法和计算机中的AUTO CAD绘图工具,迅速准确地求解一个结点上的两个未知力,并以其类推求解桁架各杆内力。特别在复杂的桁架内力计算中更显示其法优越性。关键词&#xff1a; CAD 桁架 内力一般…

python开发视频播放器_Python应用03 使用PyQT制作视频播放器实例

最近研究了Python的两个GUI包&#xff0c;Tkinter和PyQT。这两个GUI包的底层分别是Tcl/Tk和QT。相比之下&#xff0c;我觉得PyQT使用起来更加方便&#xff0c;功能也相对丰富。这一篇用PyQT实现一个视频播放器&#xff0c;并借此来说明PyQT的基本用法。 视频播放器 先把已经完成…

数据库查找姓李的人_最通俗易懂的理解什么是数据库

1.什么是数据库呢&#xff1f;每个人家里都会有冰箱&#xff0c;冰箱是用来干什么的&#xff1f;冰箱是用来存放食物的地方。同样的&#xff0c;数据库是存放数据的地方。正是因为有了数据库后&#xff0c;我们可以直接查找数据。例如你每天使用余额宝查看自己的账户收益&#…

怎么在anaconda上安装python_我是如何用Anaconda来管理Python的

Anaconda 是一个用于科学计算的 Python 发行版&#xff0c;支持 Linux, Mac, Windows, 包含了众多流行的科学计算、数据分析的 Python 包。 Anaconda主要特点: 开源各个库之间的依赖性列出所需其他依赖包。多种开源库conda是包及其依赖项和环境的管理工具适用语言&#xff1a;P…

rdd分片 spark_Spark分区

一、分区的概念分区是RDD内部并行计算的一个计算单元&#xff0c;RDD的数据集在逻辑上被划分为多个分片&#xff0c;每一个分片称为分区&#xff0c;分区的格式决定了并行计算的粒度&#xff0c;而每个分区的数值计算都是在一个任务中进行的&#xff0c;因此任务的个数&#xf…

html5 防止脚本攻击,shell防ddos攻击脚本(二)

在上一篇shell防ddos攻击脚本(一)中,我给大家发了个脚本,那只是针对单机的,如果是在负载均衡下的话,很容易把自己的服务器ip给误封,所以这篇文章就给大家发个可以添加白名单的shell脚本.系统:centos 5.9 64位脚本内容:vi ip-dos-cc.sh#!/bin/bashnetstat -an| grep :80 |grep -…

python中配置opencv_在Windows中安装OpenCV-Python|四

目标 在本教程中&#xff0c;我们将学习在你的Windows系统中设置OpenCV-Python。 下面的步骤在装有Visual Studio 2010和Visual Studio 2012的Windows 7-64位计算机上进行了测试。屏幕截图展示的是VS2012。 从预编译的二进制文件安装OpenCV 下面的Python软件包将被下载并安装到…

uip UDPclient模式通信移植,当地port随机

现在移植UDPclient模式,测试广播地址. //udp_client.c /************************************************************************************************************** 文件名称: udp_client.c* 功能: uIP UDP客户端相关函数* 作者: cp1300139.com* 创建时间: 20…

react如何遍历并比较_[前端进阶] 这可能是最通俗易懂的React 渲染原理及性能优化...

如今的前端&#xff0c;框架横行&#xff0c;出去面试问到框架是常有的事。我比较常用React&#xff0c; 这里就写了一篇 React 基础原理的内容&#xff0c; 面试基本上也就问这些&#xff0c; 分享给大家。React 是什么React是一个专注于构建用户界面的 Javascript Library.一…

基于git的工作流程

本文针对的是追求极致、快速的产品响应团队的。以下的观点和内容都是围绕这个主题&#xff0c;暂时不涉及个人学习和团队学习。 在说工作流程之间&#xff0c;想说一下我们平常工作中遇到的一些困惑或者说现象 在一个团队里&#xff0c;同时有好多事件要解决。有的是产品迭代&a…

c 自定义实现string类 clear_CC++语言15|类的继承和派生实现代码重用、扩充

在C中&#xff0c;继承是一个对象自动获取其父对象的所有属性和行为的过程。通过继承&#xff0c;您可以重用&#xff0c;扩展或修改在其他类中定义的属性和行为。通过继承&#xff0c;可以实现函数重写以及多态。在C中&#xff0c;继承另一个类的成员的类称为派生类&#xff0…

超几何分布_常见概率分布

离散分布退化分布 若r.v. 只取常数值c&#xff0c;即 ,这时分布函数为&#xff1a; 把这种分布称为退化分布或者单点分布。伯努利分布 在一次实验中&#xff0c;事件A出现的概率为 ,不出现的概率为 ,若用 记事件A出现的次数&#xff0c;则 仅取值0或1&#xff0c;相应的…

struts学习

Structs2配置文件概述&#xff1a; <constant name"" value""></constant>详解&#xff1a;&#xff08;两个看不见的value都是设置true/false&#xff09; package的相关使用&#xff1a; &#xff08;name是包名。action相当于以前的servl…

里怎么做页眉页脚_这年头县城里在家做的电商利润怎么样

这年头县城里在家做的电商利润怎么样 mcfg6ek这年头县城里在家做的电商利润怎么样 通过上面的信息大家是否已经对多用户商城有什么优势有所了解了呢&#xff0c;如果还想了解更多多用户商城的信息&#xff0c;站进行查看咨询哦。店系统怎么进行推广。店系统的推广方式介绍我们都…

计算机如果算积分排名,超级电脑预测英超积分榜:蓝军守住第4 曼联无缘欧冠...

还有6天的时间&#xff0c;2019-20赛季的英超联赛就要重启了。虽然冠军的悬念已经不大&#xff0c;但欧冠席位以及降级名额仍有很大的变数&#xff0c;这让外界仍无比期待接下来的比赛。今日&#xff0c;超级计算机对剩余的比赛做了预测&#xff0c;并算出了最终的积分榜&#…