2010-10-06 50 views
3

大家好。使用.Net套接字從http服務器下載並保存文件

我想知道如何使用System.Net.Socket.Sockets類從HTTP服務器下載並保存文件到我的硬盤驅動器,特別是zip文件。

我知道有配發更容易的方式下載文件與.net,但我想知道如何使用套接字做,如果可能的話,當然,雖然我敢肯定它是。

我試過幾件事,沒有任何工作,一旦我沒有任何與套接字的背景經驗。

您的幫助,滿足我的好奇心,表示讚賞。 任何問題只是問。謝謝。

注意

  • 該文件是一個標準的zip文件,但是我想的方式,將與任何類型的文件工作。
  • 文件大小每天都有所不同。
  • 文件每分鐘下載一次,必須禁用此類文件的緩存才能從服務器獲取準確的更新文件版本。
  • 文件URL樣本:www.somewhere.com/files/feed/list.zip

回答

3

你可以用.NET插座直接做到這一點,但它需要分析和理解HTTP請求。

執行此操作的標準方法只是使用更高級別的System.Net類。例如,這可以通過WebClient.DownloadFile兩行代碼完成 - 爲什麼讓自己的生活更加困難?


如果你真的必須從原始套接字做到這一點,它只需要很多工作。在覈心部分,您可以通過TCP連接連接到端口80(假設爲http),將正確的字符串寫入套接字並開始接收數據。這就是說,讓一切正確,並處理所有需要的問題遠遠超出了標準的StackOverflow答案的範圍。如果你想走這條路,請看看HTTP Protocol specifications - 你需要實現這個規範的正確方面。

+1

@ Reed:我已經在使用簡單的方法,我想知道和理解困難的方法。這基本上是簡單的方法的骨幹,糾正我,如果我錯了。 – 2010-10-06 23:24:12

+1

@FábioAntunes:如果你想要「超越簡單的方式」,我編輯了我的答案,爲你提供這方面所需的指導。 – 2010-10-06 23:53:41

+0

@Reed:任何建議,技巧,DOS和不要做,並且一個特殊的工具來監視流量感激? – 2010-10-07 01:32:12

1

爲此,您可以簡單地在.net中使用「HttpWebRequest」和「HttpWebResponse」類。

下面是我寫的示例控制檯應用程序,演示了這是多麼容易。

using System; 
using System.Collections.Generic; 
using System.Text; 
using System.Net; 
using System.IO; 

namespace Test 
{ 
    class Program 
    { 
     static void Main(string[] args) 
     { 
      string url = "www.somewhere.com/files/feed/list.zip";  
      string fileName = @"C:\list.zip"; 

      HttpWebRequest request = (HttpWebRequest)WebRequest.Create(url); 
      request.Timeout = 5000; 

      try 
      { 
       using (WebResponse response = (HttpWebResponse)request.GetResponse()) 
       { 
        using (FileStream stream = new FileStream(fileName, FileMode.Create, FileAccess.Write)) 
        { 
         byte[] bytes = ReadFully(response.GetResponseStream()); 

         stream.Write(bytes, 0, bytes.Length); 
        } 
       } 
      } 
      catch (WebException) 
      { 
       Console.WriteLine("Error Occured"); 
      } 
     } 

     public static byte[] ReadFully(Stream input) 
     { 
      byte[] buffer = new byte[16 * 1024]; 
      using (MemoryStream ms = new MemoryStream()) 
      { 
       int read; 
       while ((read = input.Read(buffer, 0, buffer.Length)) > 0) 
       { 
        ms.Write(buffer, 0, read); 
       } 
       return ms.ToArray(); 
      } 
     } 
    } 
} 

享受!

+0

我很欣賞。但我想使用套接字,我認爲它是所有其他的主幹,包括'HttpWebRequest','WebClient',...感謝代碼的任何方式。 – 2010-10-06 23:28:11

+1

@FábioAntunes如果你真的想看看它是如何在套接字級完成的,你可以使用Redgate反射器來查看HttpWebRequest和HttpWebResponse的底層源代碼。http://www.red-gate.com/產品/反射器/ – Doug 2010-10-06 23:34:57

+0

+1。確實有用的工具,謝謝。 – 2010-10-06 23:38:31