使用.Net Socket从http服务器下载并保存文件

时间:2010-10-06 23:05:22

标签: c# .net sockets

大家好。

我想知道如何使用zip类将文件下载并保存到我的硬盘驱动器,特别是来自HTTP服务器的System.Net.Socket.Sockets文件。

我知道有更简单的方法来下载文件与.Net,但我想知道怎么做 with Sockets ,如果可能的话,当然我很确定它是。

我尝试了一些东西,一旦我没有任何插槽背景经验就没有用。

感谢您满意我的好奇心。 任何问题只是问。谢谢。

注意

  • 该文件是标准的zip文件,但是我想要一种适用于任何文件类型的方法。
  • 文件大小每天都不同。
  • 每分钟下载一次文件,必须禁用此类文件的缓存,以便从服务器获取准确的更新文件版本。
  • 文件网址示例:www.somewhere.com/files/feed/list.zip

2 个答案:

答案 0 :(得分:3)

您可以直接使用.NET套接字执行此操作,但需要解析和理解HTTP请求。

执行此操作的标准方法是使用更高级别的System.Net类。例如,这可以通过WebClient.DownloadFile在两行代码中完成 - 为什么让自己的生活变得更加困难?


如果你真的必须从原始套接字执行此操作,那么只需要做很多工作。在它的核心,你可以通过TCP连接连接到端口80(假设http),将正确的字符串写入套接字,并开始接收数据。

话虽如此,让一切正确,处理所有需要的问题远远超出标准StackOverflow答案的范围。如果您想沿着这条路前行,请查看HTTP Protocol specifications - 您需要实施此规范的正确方面。

答案 1 :(得分: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();
            }
        }
    }
}

享受!