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

3

大家好。

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

我知道使用.Net有更简单的方法来下载文件,但是我想知道如何使用套接字进行下载,如果可能的话,当然这样做我很确定可以。

我尝试了一些东西,但由于我没有任何套接字方面的经验,所以什么都没做成。

非常感谢您帮助我满足好奇心。如果有问题,请随时问我。谢谢。

注意:

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

3
你可以直接使用.NET套接字来完成此操作,但这需要解析和理解HTTP请求。
标准的方法是使用更高级别的System.Net类。例如,通过WebClient.DownloadFile可以在两行代码中完成此操作,为什么要让生活变得更加困难呢?
如果你确实需要使用原始套接字进行此操作,那么这将需要大量的工作。在其核心中,您可以通过TCP连接连接到端口80(假设为http),向套接字写入正确的字符串,并开始接收数据。
话虽如此,确保一切正确,并处理所需的所有问题远远超出了标准StackOverflow答案的范围。如果您想走这条路,请查看HTTP协议规范 - 您将需要实现此规范的适当方面。

1
@Reed:我已经使用了简单的方法,但我想知道和理解困难的方法。这基本上是简单方法的支撑,如果我错了,请纠正我。 - Fábio Antunes
1
@Fábio Antunes:我编辑了我的答案,为您提供了指导,如果您想要“超越简单的方法”。 - Reed Copsey
@Reed:有什么建议、技巧、注意事项和特殊工具可以监控流量吗?感激不尽。 - Fábio Antunes
1
@Fabio,你可以使用Wireshark来嗅探流量并了解哪部分是头部,哪部分是有效载荷。 - user199421
@Reed:谢谢Reed。我也得到了一些结果,我得到了文件的内容,我可以将其打印到控制台上,就像在记事本中打开一样。有趣的是,在下载和打印后,控制台会不断发出哔哔声,原因我不知道。谢谢Reed。 - Fábio Antunes
显示剩余2条评论

0

你可以在 .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();
            }
        }
    }
}

享受吧!


我很感激。但是我想使用套接字,我认为这是所有其他套接字的基础,包括HttpWebRequestWebClient等。无论如何,感谢您提供的代码。 - Fábio Antunes
1
@Fábio Antunes 如果你真的想要查看HttpWebRequest和HttpWebResponse的底层源代码,你可以使用Redgate反编译器。http://www.red-gate.com/products/reflector/ - Doug

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接