Từ 1 tới 6 trên tổng số 6 kết quả

Đề tài: Cách viết chương trình tăng tốc download

  1. #1
    Ngày gia nhập
    06 2007
    Bài viết
    14

    Angry Cách viết chương trình tăng tốc download

    Mình xin được trình bày cách để viết một chương trình tăng tốc download đơn giản.

    Giao thức HTTP cho phép client yêu cầu một phần nào đó của file vì thế khi gửi yêu cầu download một file thay vì chúng ta chỉ tạo một kết nối và yêu cầu từ đầu đến cuối của file thì ta tạo ra nhiều kết nối và mỗi kết nối chỉ yêu cầu một phần của file sau khi tải xong các phần về các bạn có thể nối các phần đó lại thành một file hoàn chỉnh.

    Giả sử chúng ta cần download một file có kích thước là 8MB giả sử chúng ta tạo 4 kết nối để download file này thì ta sẻ có 4 phần của file phần 1 yêu cầu 2MB (1->2) đầu tiên và phần thứ 2 là 2MB (3->4) kế tiếp và phần thứ 3 là 2MB(5->6) kế tiếp của phần 2 và phần thứ 4 là 2MB ( 7->8 ) cuối của file. Sau khi download xong các phần bạn nối lại lúc đó chúng ta sẻ có được file hoàn chỉnh.

    Vì nhiều lý do ở cả client và server mà mỗi kết nối có giới hạn về tốc độ vì thế nếu chúng ta mở nhiều kết nối để yêu cầu download một file sẻ có tốc độ nhanh hơn tuy nhiên điều này không phải lúc nào cũng đúng .
    Và chúng ta chỉ có thể mở nhiều kết nối để download một file khi server đó hỗ trợ download từng phần của file.

    Để tạo một kết nối http trong c# chúng ta có thể làm như sau :
    Visual C# Code:
    1.  
    2. // kết nối đến server chứa file download
    3. System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(link_download);
    4.  
    5. // nhận kết quả trả về từ server ta dùng
    6. System.IO.Stream stream = request.GetResponse().GetResponseStream();


    Tuy nhiên đoạn code trên chỉ mở một kết nối và yêu cầu mặc định là từ đầu đến cuối của một file vậy để mở nhiều kết nối và yêu cầu 1 phần nào đó của file ta dùng :

    Visual C# Code:
    1. System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(link_download);
    2.  
    3. request.ConnectionGroupName=maketnoi;
    4. request.AddRange(from, to);
    5.  
    6. System.IO.Stream stream = request.GetResponse().GetResponseStream();

    lưu ý :
    request.ConnectionGroupName là tên kết nối phải khác nhau giả sử bạn mở 4 kết nối để yêu cầu download một file thì bạn đặt tên các request.ConnectionGroupName phải khác nhau ví dụ như "phan 1", "phan 2" chẳng hạn. Vì nếu chúng ta không sử dụng request.ConnectionGroupName hoặc sử dụng mà dùng cùng một tên cho cả 4 kết nối thì các kết nối sẻ nhận dữ liệu một cách tuần tự tức là sau khi kết nối 1 nhận xong mới bắt đầu tới kết nối 2 ... và như thế thì không khác gì chỉ mở một kết nối để download một file cả.

    request.AddRange(from, to) có nghĩa là kết nối này yêu cầu một phần bắt đầu từ from bytes đến to bytes.
    ví dụ ta cần download file có kích thước là 8 bytes và ta mở 4 kết nối :

    Visual C# Code:
    1. request1.AddRange(0, 2);
    2. request2.AddRange(2, 4);
    3. request3.AddRange(4, 6);
    4. request4.AddRange(6, 8);


    tuy nhiên phương thức AddRange chỉ có đối số là kiểu int 32 bit vì thế nếu muốn download file lớn hơn 2GB thì chúng ta không dùng AddRange được
    ta sử lý như sau


    Visual C# Code:
    1.  
    2.             System.Reflection.MethodInfo method = typeof(System.Net.WebHeaderCollection).GetMethod("AddWithoutValidate", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
    3.             string Key = "Range";
    4.             string Range = string.Format("bytes={0}-{1}", from, to);
    5.             method.Invoke(request.Headers, new object[] { Key, Range });


    vậy ta viết lại phương thức yêu cầu một phần nào đó của file như sau

    Visual C# Code:
    1. public System.Net.HttpWebResponse DownloadPartFile(string link_download,int from,int to)
    2. {
    3.  
    4.             System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(link_download);
    5.  
    6.             request.ConnectionGroupName=link_download+"("+from+"-"+to+")";
    7.  
    8.             System.Reflection.MethodInfo method = typeof(System.Net.WebHeaderCollection).GetMethod("AddWithoutValidate", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
    9.             string Key = "Range";
    10.             string Range = string.Format("bytes={0}-{1}", from, to);
    11.             method.Invoke(request.Headers, new object[] { Key, Range });
    12.  
    13.             return (System.Net.HttpWebResponse)request.GetResponse();
    14. }

    Có gì thắc mắc các bạn có thể đặt câu hỏi tại đây nhé .

    Chúc các bạn cuối tuần vui vẻ .
    Đã được chỉnh sửa lần cuối bởi Romantic123 : 31-08-2010 lúc 10:43 AM.

  2. #2
    Ngày gia nhập
    06 2007
    Bài viết
    14

    Talking Source code chương trình tăng tốc download viết bằng C#

    Hôm nay mình share các bạn source code chương trình tăng tốc download do mình viết cách đây cũng khá lâu rồi, cũng lâu rồi mình không phát triển nó nữa nên một số tính năng kèm theo như lấy link và download trên mediafire đã bị "tê liệt" rồi . Nay mình share cả project cho các bạn, bạn nào muốn phát triển tiếp hoặc các bạn mới học lập trình .Net tìm hiểu thêm thì lấy về tham khảo nhé.
    Attached Files Attached Files

  3. #3
    Ngày gia nhập
    10 2011
    Bài viết
    1

    Mặc định Code không hoạt động

    Chào bạn. Bài viết của bạn rất hay và mình cũng đang nghiên cứu phần này. Nhưng không hiểu sao code download 1 phần bất kì của file không chạy. Không biết liệu có thiếu điều kiện gì để hoạt động không ?

    Mình dùng như thế này :
    Code:
                System.Net.HttpWebResponse request = DownloadPartFile("http://d2ce223loljjr2.cloudfront.net/ubuntu-11.10-desktop-i386.iso", 0, 20000);
    Mong bạn sớm giúp đỡ.

  4. #4
    Ngày gia nhập
    10 2011
    Bài viết
    3

    bạn có thể cho mình code 1 phần mềm download đơn giản, chỉ cần nhập url vào và download! Cảm ơn bạn nhiều!

  5. #5
    Ngày gia nhập
    11 2010
    Bài viết
    3

    Mặc định bạn ơi bạn có thể giúp mình cách nối file với nhau không

    Trích dẫn Nguyên bản được gửi bởi Romantic123 Xem bài viết
    Mình xin được trình bày cách để viết một chương trình tăng tốc download đơn giản.

    Giao thức HTTP cho phép client yêu cầu một phần nào đó của file vì thế khi gửi yêu cầu download một file thay vì chúng ta chỉ tạo một kết nối và yêu cầu từ đầu đến cuối của file thì ta tạo ra nhiều kết nối và mỗi kết nối chỉ yêu cầu một phần của file sau khi tải xong các phần về các bạn có thể nối các phần đó lại thành một file hoàn chỉnh.

    Giả sử chúng ta cần download một file có kích thước là 8MB giả sử chúng ta tạo 4 kết nối để download file này thì ta sẻ có 4 phần của file phần 1 yêu cầu 2MB (1->2) đầu tiên và phần thứ 2 là 2MB (3->4) kế tiếp và phần thứ 3 là 2MB(5->6) kế tiếp của phần 2 và phần thứ 4 là 2MB ( 7->8 ) cuối của file. Sau khi download xong các phần bạn nối lại lúc đó chúng ta sẻ có được file hoàn chỉnh.

    Vì nhiều lý do ở cả client và server mà mỗi kết nối có giới hạn về tốc độ vì thế nếu chúng ta mở nhiều kết nối để yêu cầu download một file sẻ có tốc độ nhanh hơn tuy nhiên điều này không phải lúc nào cũng đúng .
    Và chúng ta chỉ có thể mở nhiều kết nối để download một file khi server đó hỗ trợ download từng phần của file.

    Để tạo một kết nối http trong c# chúng ta có thể làm như sau :
    Visual C# Code:
    1.  
    2. // kết nối đến server chứa file download
    3. System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(link_download);
    4.  
    5. // nhận kết quả trả về từ server ta dùng
    6. System.IO.Stream stream = request.GetResponse().GetResponseStream();


    Tuy nhiên đoạn code trên chỉ mở một kết nối và yêu cầu mặc định là từ đầu đến cuối của một file vậy để mở nhiều kết nối và yêu cầu 1 phần nào đó của file ta dùng :

    Visual C# Code:
    1. System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(link_download);
    2.  
    3. request.ConnectionGroupName=maketnoi;
    4. request.AddRange(from, to);
    5.  
    6. System.IO.Stream stream = request.GetResponse().GetResponseStream();

    lưu ý :
    request.ConnectionGroupName là tên kết nối phải khác nhau giả sử bạn mở 4 kết nối để yêu cầu download một file thì bạn đặt tên các request.ConnectionGroupName phải khác nhau ví dụ như "phan 1", "phan 2" chẳng hạn. Vì nếu chúng ta không sử dụng request.ConnectionGroupName hoặc sử dụng mà dùng cùng một tên cho cả 4 kết nối thì các kết nối sẻ nhận dữ liệu một cách tuần tự tức là sau khi kết nối 1 nhận xong mới bắt đầu tới kết nối 2 ... và như thế thì không khác gì chỉ mở một kết nối để download một file cả.

    request.AddRange(from, to) có nghĩa là kết nối này yêu cầu một phần bắt đầu từ from bytes đến to bytes.
    ví dụ ta cần download file có kích thước là 8 bytes và ta mở 4 kết nối :

    Visual C# Code:
    1. request1.AddRange(0, 2);
    2. request2.AddRange(2, 4);
    3. request3.AddRange(4, 6);
    4. request4.AddRange(6, 8);


    tuy nhiên phương thức AddRange chỉ có đối số là kiểu int 32 bit vì thế nếu muốn download file lớn hơn 2GB thì chúng ta không dùng AddRange được
    ta sử lý như sau


    Visual C# Code:
    1.  
    2.             System.Reflection.MethodInfo method = typeof(System.Net.WebHeaderCollection).GetMethod("AddWithoutValidate", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
    3.             string Key = "Range";
    4.             string Range = string.Format("bytes={0}-{1}", from, to);
    5.             method.Invoke(request.Headers, new object[] { Key, Range });


    vậy ta viết lại phương thức yêu cầu một phần nào đó của file như sau

    Visual C# Code:
    1. public System.Net.HttpWebResponse DownloadPartFile(string link_download,int from,int to)
    2. {
    3.  
    4.             System.Net.HttpWebRequest request = (System.Net.HttpWebRequest)System.Net.WebRequest.Create(link_download);
    5.  
    6.             request.ConnectionGroupName=link_download+"("+from+"-"+to+")";
    7.  
    8.             System.Reflection.MethodInfo method = typeof(System.Net.WebHeaderCollection).GetMethod("AddWithoutValidate", System.Reflection.BindingFlags.Instance | System.Reflection.BindingFlags.NonPublic);
    9.             string Key = "Range";
    10.             string Range = string.Format("bytes={0}-{1}", from, to);
    11.             method.Invoke(request.Headers, new object[] { Key, Range });
    12.  
    13.             return (System.Net.HttpWebResponse)request.GetResponse();
    14. }

    Có gì thắc mắc các bạn có thể đặt câu hỏi tại đây nhé .

    Chúc các bạn cuối tuần vui vẻ .
    bạn có thể nói rõ hơn về phần hiển thị từng segmentegd trong prosessbar không và cả phần nối các segment với nhau.Mong nhận được hồi âm của bạn

  6. #6
    Ngày gia nhập
    03 2014
    Bài viết
    1

    Mặc định Cách viết chương trình tăng tốc download

    cảm ơn a.........

Các đề tài tương tự

  1. Cách thức hoạt động của phần mềm tăng tốc download IDM!!!
    Gửi bởi ducchientb91 trong diễn đàn Thắc mắc chung
    Trả lời: 2
    Bài viết cuối: 26-11-2012, 05:46 PM
  2. Download IDM phần mềm hỗ trợ tăng tốc download tối đa
    Gửi bởi thuhu0900x trong diễn đàn Software (Phần mềm) | Ebooks
    Trả lời: 19
    Bài viết cuối: 11-09-2012, 06:36 PM
  3. Làm sao để khi ta click vào link download thì trường download tự động tăng lên 1
    Gửi bởi thangemhamhochoi trong diễn đàn Thắc mắc lập trình ASP.NET
    Trả lời: 14
    Bài viết cuối: 16-11-2011, 03:10 PM
  4. Viết chương trình download file bằng VC++?
    Gửi bởi kimlong008 trong diễn đàn Thắc mắc lập trình Visual C++
    Trả lời: 2
    Bài viết cuối: 16-12-2010, 12:27 PM
  5. Chương trình tăng tốc download và một số tính năng khác viết bằng C#
    Gửi bởi Romantic123 trong diễn đàn Sản phẩm phần mềm của bạn
    Trả lời: 11
    Bài viết cuối: 31-08-2010, 11:21 AM

Quyền hạn của bạn

  • Bạn không thể gửi đề tài mới
  • Bạn không thể gửi bài trả lời
  • Bạn không thể gửi các đính kèm
  • Bạn không thể chỉnh sửa bài viết của bạn