zoukankan      html  css  js  c++  java
  • C#网络编程

     第三篇来的好晚啊,上一篇说了如何向服务器推送信息,这一篇我们看看如何"快好准"的从服务器下拉信息。

        网络上有很多大资源文件,比如供人下载的zip包,电影(你懂的),那么我们如何快速的进行下载,大家第一反应肯定就是多线程下载,

    那么这些东西是如何做的呢?首先我们可以从“QQ的中转站里面拉一个rar下来“。

    然后用fiddler监视一下,我们会发现一个有趣的现象:

    第一:7.62*1024*1024≈7990914  千真万确是此文件

    第二:我明明是一个http链接,tmd的怎么变成n多个了?有意思。

    好,我们继续往下看,看看这些链接都做了些什么?

    最终,我们发现http协议中有一个Conent—Range字段,能够把我们的文件总大小进行切分,然后并行下载,最后再进行合并,大概我们知道

    了什么原理,那么,我们强大的C#类库提供了AddRange来获取Http中资源的指定范围。

    既然进行了切分,那么首先一定要知道文件的ContentLength是多少,如果对http协议比较熟悉的话,当发送一个头信息过去,服务器返回的

    头信息中会包含很多东西,此时我们就知道要下载资源的大概情况,这个就有点“兵马未动,粮草先行“的感觉。

    复制代码
     1             var request = (HttpWebRequest)HttpWebRequest.Create(url);
     2 
     3             request.Method = "Head";
     4 
     5             request.Timeout = 3000;
     6 
     7             var response = (HttpWebResponse)request.GetResponse();
     8 
     9             var code = response.StatusCode;
    10 
    11             if (code != HttpStatusCode.OK)
    12             {
    13                 Console.WriteLine("下载资源无效!");
    14                 return;
    15             }
    16 
    17             var total = response.ContentLength;
    复制代码

    这里有个决策,到底是以下载量来决定线程数,还是以线程数来决定下载量,由于我们的下载取决于当前的网速,所以在这种场合下更好的方案是

    采用后者,这几天在闪存里面两次看到苍老师,肃然起敬,所以决定在不用线程和线程的情况下,看看下载仓老师的速度如何。

    图片大小(217.27KB)

    View Code

          在下面的图中可以看出,我们的资源被分成了n段,在217.27KB的情况下,多线程加速还不是很明显,我们可以试试更大的文件,这里我就

    在本地放一个133M的rar文件。

            //请求文件
            public static string url = "http://localhost:56933/1.rar";

    现在看一下效果是非常明显的。

    C#网络编程

    12篇学通C#网络编程——第三篇 HTTP应用编程(下)
    摘要: 第三篇来的好晚啊,上一篇说了如何向服务器推送信息,这一篇我们看看如何"快好准"的从服务器下拉信息。 网络上有很多大资源文件,比如供人下载的zip包,电影(你懂的),那么我们如何快速的进行下载,大家第一反应肯定就是多线程下载,那么这些东西是如何做的呢?首先我们可以从“QQ的中转站里面拉一个rar下来“。然后用fiddler监视一下,我们会发现一个有趣的现象:第一:7.62*1024*1024≈7990914 千真万确是此文件第二:我明明是一个http链接,tmd的怎么变成n多个了?有意思。好,我们继续往下看,看看这些链接都做了些什么?最终,我们发现http协议中有一个Cone阅读全文

    posted @ 2012-05-20 13:42 一线码农 阅读(703) | 评论 (3) 编辑

    12篇学通C#网络编程——第二篇 HTTP应用编程(上)
    摘要: 我们学习网络编程最熟悉的莫过于Http,好,我们就从Http入手,首先我们肯定要了解一下http的基本原理和作为,对http的工作原理有一定程度的掌握,对我们下面的学习都是有很大帮助的。一: 工作方式 ①:client和server建立可靠的TCP连接。 ②:然后client通过Socket向server发送http请求。 ③:server端处理请求,返回处理数据。 ④:在http1.0中,client与server之间的tcp连接立即断开。 但在http1.1中,因为默认支持“tcp的长连接”,所以server端采用超时才断开tcp连接的策略。二: 特点 ①:Http是...阅读全文

    posted @ 2012-01-09 01:29 一线码农 阅读(3834) | 评论 (42) 编辑

    12篇学通C#网络编程——第一篇 基础之进程线程
    摘要: 在C#的网络编程中,进程和线程是必备的基础知识,同时也是一个重点,所以我们要好好的掌握一下。一:概念 首先我们要知道什么是”进程”,什么是“线程”,好,查一下baike。 进程:是一个具有一定独立功能的程序关于某个数据集合的一次活动。它是操作系统动态执行的基本单元, 在传统的操作系统中,进程既是基本的分配单元,也是基本的执行单元。 线程:是"进程"中某个单一顺序的控制流。关于这两个概念,大家稍微有个印象就行了,防止以后被面试官问到。二:进程 framework里面对“进程”的基本操作的封装还是蛮好的,能够满足我们实际开发中的基本应用。<1> 获取进程信息 fra阅读全文

    posted @ 2012-01-03 02:44 一线码农 阅读(4393) | 评论 (32) 编辑

  • 相关阅读:
    543. Diameter of Binary Tree【Easy】【二叉树的直径】
    114. Flatten Binary Tree to Linked List【Medium】【将给定的二叉树转化为“只有右孩子节点”的链表(树)】
    Java实现蛇形矩阵
    215. Kth Largest Element in an Array【Medium】【找到第 k 大的元素】
    524. Longest Word in Dictionary through Deleting【Medium】【删除后得到的字典中的最长单词】
    141. Linked List Cycle【Easy】【判断链表是否存在环】
    88. Merge Sorted Array【Easy】【双指针-不用额外空间归并两个有序数组】
    680. Valid Palindrome II【Easy】【双指针-可以删除一个字符,判断是否能构成回文字符串】
    345. Reverse Vowels of a String【Easy】【双指针-反转字符串中的元音字符】
    633. Sum of Square Numbers【Easy】【双指针-是否存在两个数的平方和等于给定目标值】
  • 原文地址:https://www.cnblogs.com/Leo_wl/p/2510985.html
Copyright © 2011-2022 走看看