c# Http下载
1.首先是服务器上发布资源,如果资源时自定义格式,比如 .zidingyi结尾的后缀文件,需要在MIME类型上添加处理方式
需要注意的是.net里面要设置
System.Net.ServicePointManager.DefaultConnectionLimit = 50;
2.客户端采用WebRequest进行请求,WebRequest处理响应
/// <summary>
/// Http协议下载助手
/// </summary>
public class HttpDownLoadHelper
{
#region 变量,属性
private HttpWebRequest request;
private HttpWebResponse response;
public string SavePath { get; set; }
public string URL { get; set; }
public string State { get; set; }
private int iReConnectTimes = 0;//重连次数
public long DownLoadedSize { get; set; }//已下载大小
private bool IFAbortExec = true;//是否异常中断
FileStream fs;
Stream reader;
#endregion
#region 构造函数
public HttpDownLoadHelper()
{
}
public HttpDownLoadHelper(string vsServerFilePath, string vsSavePath)
{
//request = (HttpWebRequest)HttpWebRequest.Create(new Uri(vsServerFilePath));
this.URL = vsServerFilePath;
SavePath = vsSavePath;
}
#endregion
#region 方法
/// <summary>
/// 读取已下载文件大小
/// </summary>
public void Init()
{
if (File.Exists(SavePath))//断点续传
{
fs = File.OpenWrite(SavePath);
DownLoadedSize = fs.Length;
fs.Close();
}
}
public void DownLoadFile(string vsServerFilePath, string vsSavePath)
{
URL = vsServerFilePath;
SavePath = vsSavePath;
DownLoadFile();
}
public void DownLoadFile()
{
try
{
request = (HttpWebRequest)HttpWebRequest.Create(new Uri(URL));
request.KeepAlive = true;
request.Timeout = 1000 * 10;
request.ReadWriteTimeout = 1000 * 20;//不知道为啥,流read的时候会超时
long startPos = 0;
if (File.Exists(SavePath))//断点续传
{
fs = File.OpenWrite(SavePath);
if (fs.Length > 0)//对于已下载的索引文件,重新下载最后一个字节,否则AddRange会出错,因为文件大小获取是总的
{
fs.Seek(fs.Length - 1, SeekOrigin.Current);
startPos = fs.Length - 1;
}
else
{
fs.Seek(fs.Length, SeekOrigin.Current);
startPos = fs.Length;
}
}
else//全新下载
{
string vsDir = Path.GetDirectoryName(SavePath);
if (!Directory.Exists(vsDir))
{
Directory.CreateDirectory(vsDir);
}
fs = new FileStream(SavePath, FileMode.Create);
startPos = 0;
}
DownLoadedSize = startPos;
if (!string.IsNullOrEmpty(State) && State.ToUpper() == "PAUSED")
{
fs.Close();
return;
}
if (startPos > 0)
{
request.AddRange(startPos);
}
byte[] buffer = new byte[1024 * 32];
response = (HttpWebResponse)request.GetResponse();
reader = response.GetResponseStream();
int iRead = reader.Read(buffer, 0, buffer.Length);
DownLoadedSize += iRead;
while (iRead > 0)
{
fs.Write(buffer, 0, iRead);
iRead = reader.Read(buffer, 0, buffer.Length);
DownLoadedSize += iRead;
}
fs.Close();
reader.Close();
if (response != null)
{
response.Close();
}
if (request != null)
{
request.Abort();
}
}
catch (Exception ex)
{
if (IFAbortExec)
{
Logger.LogError(ex);
}
//断线重连
++iReConnectTimes;
if (iReConnectTimes > 5 || !IFAbortExec)//清理资源
{
fs.Close();
if (reader != null)
{
reader.Close();
}
if (response != null)
{
response.Close();
}
if (request != null)
{
request.Abort();
}
}
else if (IFAbortExec)//异常中断才可重连,先清理资源
{
fs.Close();
if (reader != null)
{
reader.Close();
}
if (response != null)
{
response.Close();
}
if (request != null)
{
request.Abort();
}
DownLoadFile();
} }
}
public void GetDownLoadedSize()
{
long startPos = 0;
if (File.Exists(SavePath))//断点续传
{
fs = File.OpenWrite(SavePath);
fs.Seek(fs.Length, SeekOrigin.Current);
startPos = fs.Length;
}
else//全新下载
{
fs = new FileStream(SavePath, FileMode.Create);
startPos = 0;
}
DownLoadedSize = startPos;
}
public void Abort()
{
try
{
IFAbortExec = false;//非异常中断
if (request != null)
{
request.Abort();
}
if (response != null)
{
response.Close();
}
if (fs != null)
{
fs.Close();
}
if (reader != null)
{
reader.Close();
}
}
catch (Exception ex)
{
Logger.LogError(ex);
}
}
public void Cancel()
{
Abort();
//删除文件
try
{
if (File.Exists(SavePath))
{
File.Delete(SavePath);
}
}
catch (Exception ex)
{
Logger.LogError(ex);
}
}
#endregion
}
c# Http下载的更多相关文章
- C# ini文件操作【源码下载】
介绍C#如何对ini文件进行读写操作,C#可以通过调用[kernel32.dll]文件中的 WritePrivateProfileString()和GetPrivateProfileString()函 ...
- ASP.NET Aries 入门开发教程1:框架下载与运行
背景: 鉴于框架的使用者越来越多,文档太少,不少用户反映框架的入门门槛太高. 好吧,再辛苦下,抽时间写教程吧! 步骤1:下载框架源码 开源地址:https://github.com/cyq1162/A ...
- WinForm 天猫2013双11自动抢红包【源码下载】
1. 正确获取红包流程 2. 软件介绍 2.1 效果图: 2.2 功能介绍 2.2.1 账号登录 页面开始时,会载入这个网站:https://login.taobao.com/member/login ...
- C# Excel导入、导出【源码下载】
本篇主要介绍C#的Excel导入.导出. 目录 1. 介绍:描述第三方类库NPOI以及Excel结构 2. Excel导入:介绍C#如何调用NPOI进行Excel导入,包含:流程图.NOPI以及C#代 ...
- C# 条形码操作【源码下载】
本篇介绍通过C#生成和读取一维码.二维码的操作. 目录 1. 介绍:介绍条形码.条形码的分类以及ZXing.Net类库. 2. 一维码操作:包含对一维码的生成.读取操作. 3. 二维码操作:包含对二维 ...
- mysql 7下载安装及问题解决
mysql 7安装及问题解决 一.mysql下载 下载地址:https://www.mysql.com/downloads/ Community (GPL) Downloads MySQL Commu ...
- 11、Struts2 的文件上传和下载
文件上传 表单准备 要想使用 HTML 表单上传一个或多个文件 须把 HTML 表单的 enctype 属性设置为 multipart/form-data 须把 HTML 表单的method 属性设置 ...
- UE4新手引导之下载和安装虚幻4游戏引擎
1) 进入虚幻4的官方主页(https://www.unrealengine.com/) 这里你可以获得关于虚幻4的最新资讯,包括版本更新.博客更新.新闻和商城等.自2015年起,该引擎已经提供免费下 ...
- Windows 常用运行库下载 (DirectX、VC++、.Net Framework等)
经常听到有朋友抱怨他的电脑运行软件或者游戏时提示缺少什么 d3dx9_xx.dll 或 msvcp71.dll.msvcr71.dll又或者是 .Net Framework 初始化之类的错误而无法正常 ...
- PayPal高级工程总监:读完这100篇论文 就能成大数据高手(附论文下载)
100 open source Big Data architecture papers for data professionals. 读完这100篇论文 就能成大数据高手 作者 白宁超 2016年 ...
随机推荐
- Spring boot 控制台打印sql
在application.ym中加入: logging: level: com.wechat.cwbt.dao : debug 发现无效 在log4j.properties中加入: log4j.log ...
- LeetCode136,137寻找只出现一次的数
1.题目意思:在数组中,只有一个数字只出现了一次 其他的都出现了两次.找出那个只出现一次的数字. //利用位运算 异或 两个相同的数字异或为0 public int singleNumber(int[ ...
- ubuntu14.04 mysql-workbench Connecting to MySQL server ... Native table 'performance_schema'.'session_variables' has the wrong structure错误解决
使用的mysql版本: mysql Ver 14.14 Distrib 5.7.9, for Linux (x86_64) using EditLine wrapper 打开shell命令 1.输 ...
- python 多线程并发threading & 任务队列Queue
https://docs.python.org/3.7/library/concurrency.htmlpython程序默认是单线程的,也就是说在前一句语句执行完之前后面的语句不能继续执行先感受一下线 ...
- leetcode-240搜索二维矩阵II
搜索二维矩阵II class Solution: def searchMatrix(self, matrix, target): """ :type matrix: Li ...
- 洛谷 3106 [USACO14OPEN]GPS的决斗Dueling GPS's 3720 [AHOI2017初中组]guide
[题解] 这两道题是完全一样的. 思路其实很简单,对于两种边权分别建反向图跑dijkstra. 如果某条边在某一种边权的图中不是最短路上的边,就把它的cnt加上1.(这样每条边的cnt是0或1或2,代 ...
- [bzoj1078][SCOI2008][斜堆] (贪心)
Description 斜堆(skew heap)是一种常用的数据结构.它也是二叉树,且满足与二叉堆相同的堆性质:每个非根结点的值都比它父亲大.因此在整棵斜堆中,根的值最小.但斜堆不必是平衡的,每个结 ...
- Qt Widgets Application可执行程序发布方式
前言 写好的Qt程序想打包发布,之前按照Qt快速入门系列教程里的方法,直接选release,构建,之后找到exe,拷贝几个dll,然而报错如图: 后来找到教程:http://tieba.baidu.c ...
- Codeforces Round #259 (Div. 2) D
D. Little Pony and Harmony Chest time limit per test 4 seconds memory limit per test 256 megabytes i ...
- 2018/2/17 SpringCloud的一个简单小介绍
在学习SpringCloud之前,我以为SpringCloud是与Double一样,只是个单纯的RPC框架.但在今天的学习中,我发现并非如此,事实上,SpringCloud是多个框架的集合,感觉Spr ...