zoukankan      html  css  js  c++  java
  • 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()执行释放、清理或重置应用程序执行任务所定义的非托管资源

  • 相关阅读:
    elasticsearch 中的Multi Match Query
    activiti 流程部署的各种方式
    elasticsearch 嵌套对象之嵌套类型
    elasticsearch Java High Level REST 相关操作封装
    elasticsearch 字段数据类型
    ubuntu 安装 docker
    elasticsearch 通过HTTP RESTful API 操作数据
    facenet 人脸识别(二)——创建人脸库搭建人脸识别系统
    POJ 3093 Margaritas(Kind of wine) on the River Walk (背包方案统计)
    墨卡托投影, GPS 坐标转像素, GPS 坐标转距离
  • 原文地址:https://www.cnblogs.com/rainbow70626/p/4555455.html
Copyright © 2011-2022 走看看