WorldWind源码剖析系列:网络下载类WebDownload
网络下载类WebDownload封装了对请求的瓦片进行网络下载的相关操作。该类使用了两个委托类型和一个枚举类型。 该类的类图如下。

网络下载类WebDownload各个字段和属性的含义说明如下:
static public bool Log404Errors = false;//网络下载错误类型
static public bool useWindowsDefaultProxy = true;//是否使用Windows默认代理
static public string proxyUrl = "";//代理的URL字符串,默认为空
static public bool useDynamicProxy;// 是否使用动态代理
static public string proxyUserName = "";//代理用户名,默认为空
static public string proxyPassword = "";//代理密码,默认为空
public static string UserAgent//用户代理
public string Url;//统一资源定位符
public Stream ContentStream;//内存下载填充的数据内容流
public string SavedFilePath;//保存路径
public bool IsComplete;//是否下载完成
public DownloadProgressHandler ProgressCallback;//当数据正在被接收时调用。注意:如果服务器没有回复内容长度,总的字节数将为零
public static DownloadCompleteHandler DebugCallback;//被调用来更新debug窗口
public static DownloadCompleteHandler DownloadEnded; //当一个下载结束于成功或失败时被调用
public DownloadCompleteHandler CompleteCallback; //当一个下载完成时被调用。调用核实(查证)函数,以从事件处理函数里抛出任何异常
public DownloadType DownloadType = DownloadType.Unspecified;//下载类型
public string ContentType; //数据内容类型:浮点型或16位整形
public int BytesProcessed; //被处理的字节数
public int ContentLength; //数据内容长度
public bool Compressed = false;//是否被压缩,允许地点查找器使用gzipped压缩请求,默认为不压缩的请求,以免终端其它事情
public string ContentEncoding; //数据内容编码
public DateTime DownloadStartTime = DateTime.MinValue; //下载开始时间,如果还没有开始下载则设置为DateTime.MinValue
internal HttpWebRequest request; //Http网络请求
internal HttpWebResponse response; //Http网络响应
protected Exception downloadException;//下载异常
protected bool isMemoryDownload;//是否是内存下载
private bool stopFlag = false;//是否停止下载的标识,作为下载线程终止的标识
protected Thread dlThread;//下载线程
public bool IsDownloadInProgress//下载是否正在进行中的标识,通过判断下载线程对象是否为空以及是否处于活动状态来判断
public Exception Exception//下载异常字段的只读属性
构造函数都比较简单,不再赘述。
方法public void BackgroundDownloadFile()发起后台下载文件的线程,异步地下载请求数据到文件。被另外两种重载类型调用。重载一先注册下载完成事件委托实例CompleteCallback的处理函数,然后再调用原型函数发起后台异步下载数据的线程。重载二先设置下载完类型,然后再调用原型函数发起后台异步下载数据的线程,用来下载特定类型的影像数据,需要为WMS请求处理服务错误
方法public void BackgroundDownloadMemory()发起后台内存下载文件的线程,异步地下载请求数据到内存缓冲区。被另外两种重载类型调用。重载一先注册下载完成事件委托实例CompleteCallback的处理函数,然后再调用原型函数发起后台异步下载数据的线程。重载二先设置下载完类型,然后再调用原型函数发起后台异步下载数据的线程,用来下载特定类型的影像数据,需要为WMS请求处理服务错误
方法public void DownloadFile( string destinationFile ) 同步地下载请求数据到文件,其内部调用Download()函数真正完成同步数据下载。被另外一种重载类型调用。其重载先设置下载类型,然后再调用原型函数下载数据
方法public void DownloadMemory( DownloadType dlType ) 同步地下载请求数据到内存缓冲区。被另外两种重载类型调用。重载一先设置下载类型,然后再调用原型函数同步下载数据。重载二先注册下载处理中事件委托实例progressCallback的处理函数,然后再调用原型函数同步下载数据
方法public void Cancel()终止当前的下载
方法public void SaveMemoryDownloadToFile(string destinationFilePath )保存Http内存下载数据到文件中
方法private void OnProgressCallback(int bytesRead, int totalBytes)表示正在下载中的回调函数,内部调用委托ProgressCallback注册的处理函数。该方法被Download()函数三次调用
方法private static void OnDebugCallback(WebDownload wd)当需要下载细节信息是被调用,内部调用委托DebugCallback注册的处理函数。该方法被Download()函数三次调用,被Dispose()函数调用一次
方法private static void OnDownloadEnded(WebDownload wd)当下载已经结束时被调用,内部调用委托DownloadEnded注册的处理函数。该方法被Download()函数一次调用
方法protected void Download()同步进行HTTP下载,被前文提到的异步文件下载BackgroundDownloadFile,异步内存下载BackgroundDownloadMemory,同步文件下载DownloadFile,同步内存下载DownloadMemory四个函数四次调用。该方法的概略执行步骤为:先调用OnProgressCallback和OnDebugCallback去通知注册的委托做相应的处理,再通过isMemoryDownload变量判断是内存下载还是文件下载,从而为流变量ContentStream申请内存流或文件流空间。然后创建网络请求对象,并为请求对象指定用户代理、代理内容。然后利用网络请求对象依次获取请求响应和请求响应流,并将请求响应流中的内容提取出来(以1500字节为单位逐次提取)再写入到前面申请的流对象ContentStream的空间中去,接着调用OnProgressCallback和OnDebugCallback去通知注册的委托做相应的处理。最后调用OnDownloadEnded(this)方法转到注册的委托实例函数去做相关的处理。
方法private void HandleErrors()处理未被网络请求自身捕捉的异常
方法public void Verify()当出现异常时,通过调用该函数将会被抛出
方法private void SaveException( Exception exception )把下载错误异常信息写入日志文件
方法private void SetMapServerError()读取来子服务器的XML错误,抛出具有该信息的错误
方法public void Dispose()执行释放、清理或重置应用程序执行任务所定义的非托管资源
WorldWind源码剖析系列:网络下载类WebDownload的更多相关文章
- WorldWind源码剖析系列:设置类SettingsBase
PluginSDK中的星球设置类WorldSettings 和WorldWind.程序设置类WorldWindSettings均继承自父类SettingsBase.类图如下所示.其中父类Setting ...
- WorldWind源码剖析系列:下载请求类DownloadRequest
下载请求类DownloadRequest是各种下载请求的抽象基类,先派生出网络下载请求类WebDownloadRequest,再派生出地理空间下载请求类GeoSpatialDownloadReques ...
- WorldWind源码剖析系列:挂件类Widgets
WorldWindow用户定制控件类中所包含的的挂件类Widgets控件主要有如下图所示的派生类.它们的类图如下所示. 鉴于挂件类Widgets及其派生类,相对简单,基本上都是些利用DirectX3D ...
- WorldWind源码剖析系列:缓冲类Cache
缓冲类Cache主要用于在最小的限制条件下保存从远程服务器通过网络下载下来的地理空间数据,以便当用户处于离线状态时能够使用这些已经缓冲好的数据.Google Earth也采用类似机制处理用户离线浏览漫 ...
- WorldWind源码剖析系列:下载队列类DownloadQueue
下载队列类DownloadQueue代表具有优先级的下载队列,该类的存储下载请求的数组链表专门按一定的优先级来存储下载请求的.该类的类图如下. 下载队列类DownloadQueue各个字段的含义说明如 ...
- WorldWind源码剖析系列:插件类Plugin、插件信息类PluginInfo和插件编译器类PluginCompiler
插件类Plugin是所有由插件编译器加载的插件子类的抽象父类,提供对插件的轻量级的访问控制功能. 插件信息类PluginInfo用来存储关于某个插件的信息的类,可以理解为对插件类Plugin类的进一步 ...
- WorldWind源码剖析系列:BMNG类构造函数深入分析
BMNG构造函数深入分析 一.主要类图 二.主要功能: 1) BMNG类 BMNG类将包含以“Blue Marble”为主题的所有可渲染影像的根节点添加到当前星球的可渲染对象列表中,包括 ...
- WorldWind源码剖析系列:日志类Log
Utility工程中的日志类Log主要用来输出Debug状态下的调试信息.该类的类图如下: 日志类Log中使用到的类和内嵌结构体类型主要有以下这些: public class LogEventArgs ...
- WorldWind源码剖析系列:相机类CameraBase
相机基类CameraBase PluginSDK中的相机类CameraBase是三维计算机图形学中的概念.观察者在三维场景中漫游时,通过眼睛看到的场景和相机拍摄过程非常一致.实际上,Direct3D和 ...
- WorldWind源码剖析系列:角度类Angle
PluginSDK中的角度结构体Angle类图如下所示. 角度结构体主要定义了一个弧度表示角度值的字段:double Radians.还有几个表示角度最大值.最小值.非数值和零角度等字段.定义了一个D ...
随机推荐
- HDU6154
CaoHaha's staff Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)T ...
- unity中生成一个GUI格子(始终居中)
1.Script程序 using UnityEngine; using System.Collections; public class GUITest : MonoBehaviour { [Seri ...
- require.js的基本概念及使用流程(1)
今天,我们来说一说requireJS的基本概念,在下一篇随笔中我们再去讨论讨论requireJS的使用步骤 这一篇都是一些概念性比较强的东西,希望大家擦亮自己的钛合金狗眼好好看看概念,好吧 首先,什么 ...
- 【读书笔记】iOS-网络-同步请求,队列式异步请求,异步请求的区别
一,同步请求的最佳实践. 1,只在后台过程中使用同步请求,除非确定访问的是本地文件资源,否则请不要在主线程上使用. 2,只有在知道返回的数据不会超出应用的内存时才使用同步请求.记住,整个响应体都会位于 ...
- SQL SERVER 将表字段值0和1互转的几种方法
需求: 如果表字段的值为 0 则将其修改为1 ,如果表字段的值为 1 则将其修改为 0. 方法一 end 方法二 ) 方法三 )
- 跨域cors中如何传递cookie(前端为什么无法向后端传递cookie?)
没有跨域 后端server只要在回应头部‘set-cookie’,那么就会有cookie产生并保存在客户端client. 等到client再次向后端server发送请求时浏览器的机制就会自动携带coo ...
- Python 基于Python实现邮件发送
基于Python实现邮件发送 by:授客 QQ:1033553122 测试环境: Python版本:Python 2.7 注:需要修改mimetypes.py文件(该文件可通过文章底部的网盘分 ...
- 解决ci框架php发送邮件附件中文乱码问题
CI框架发送邮件附件中文出现乱码,是因为php basename()函数不支持中文引起,修改类库 Email.php 文件中 _append_attachments()方法,大致在 1474行 添加如 ...
- 记一款bug管理系统(bugdone.cn)的开发过程(4) - 新增BugTalk功能
测试人员提出一个Bug,如果开发人员对Bug有疑义,会直接面对面讨论或者通过QQ等线上聊天工具讨论,但过后再去找讨论记录会很麻烦.因此BugDone提出一个全新的概念:将问题的讨论留在问题内.BugD ...
- windows-oracle 11g dataguard with dgbroker
一: DG的配置 oracle dg 考验dba综合能力.首先明确3个知识点: SID, SERVICE_NAME,,DB_NAME, DB_UNIQUE_NAME SID: 实例名,用于标识一个数据 ...