代码之家  ›  专栏  ›  技术社区  ›  Fábio Antunes

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

  •  3
  • Fábio Antunes  · 技术社区  · 14 年前

    大家好。

    我想知道如何下载文件并将其保存到我的硬盘,特别是 zip 使用 System.Net.Socket.Sockets 上课。

    我知道有更简单的方法 下载文件 但是我想知道怎么做 带插座 ,如果可能的话,当然,尽管我很确定。

    我试过一些东西,没有任何工作,一旦我没有任何背景经验与插座。

    感谢你帮助我满足我的好奇心。

    注意

    • 该文件是一个标准的zip文件,但我希望有一种方式,可以与任何文件类型。
    • 文件大小每天都不一样。
    • 该文件每分钟下载一次,必须禁用对该文件的缓存才能从服务器获取准确和更新的文件版本。
    • 文件url示例: www.somewhere.com/files/feed/list.zip
    2 回复  |  直到 14 年前
        1
  •  3
  •   Reed Copsey    14 年前

    您可以直接使用.NET套接字来实现这一点,但它需要解析和理解HTTP请求。

    这样做的标准方法是使用更高的级别系统.Net上课。例如,这可以在两行代码中通过 WebClient.DownloadFile -为什么让自己的生活更艰难?


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

    这就是说,正确处理所有问题,远远超出了标准StackOverflow答案的范围。如果你想沿着这条路走,看看 HTTP Protocol specifications -您需要实现本规范的适当方面。

        2
  •  1
  •   Doug    14 年前

    为此,您可以简单地使用.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();
                }
            }
        }
    }
    

    享受吧!