Загрузите и сохраните файл с http-сервера, используя .Net Socket - PullRequest
3 голосов
/ 07 октября 2010

Привет всем.

Я хотел бы знать, как загрузить и сохранить файл на моем жестком диске, в частности файл zip с HTTP-сервера, используя класс System.Net.Socket.Sockets.

Я знаю, что есть более простые способы загрузить файл с помощью .Net, но я хотел бы знать, как это сделать с помощью сокетов , если это возможно, конечно, хотя я ' Я уверен, что это так.

Я попробовал несколько вещей, ничего не получалось, если у меня нет опыта работы с сокетами.

Ваша помощь в удовлетворении моего любопытства приветствуется. Любой вопрос просто задайте. Спасибо.

Примечание

  • Этот файл является стандартным zip-файлом, однако я бы хотел, чтобы он работал с любым типом файлов.
  • Размер файла меняется каждый день.
  • Файл загружается каждую минуту, кэширование такого файла должно быть отключено, чтобы получить точную и обновленную версию файла с сервера.
  • Пример URL файла: www.somewhere.com / files / feed / list.zip

Ответы [ 2 ]

3 голосов
/ 07 октября 2010

Вы можете сделать это напрямую с сокетом .NET, но это потребует анализа и понимания HTTP-запроса.

Стандартный способ сделать это - использовать классы System.Net более высокого уровня.Например, это можно сделать в двух строках кода с помощью WebClient.DownloadFile - зачем делать жизнь себе труднее?это просто займет много работы.По сути, вы можете подключиться к порту 80 (при условии http) через TCP-соединение, записать правильные строки в сокет и начать получать данные.

При этом все получается правильно и обрабатывается всетребуемые проблемы выходят далеко за рамки стандартного ответа StackOverflow.Если вы хотите пойти по этому пути, взгляните на спецификации протокола HTTP - вам необходимо реализовать соответствующие аспекты этой спецификации.

1 голос
/ 07 октября 2010

Для этого вы можете просто использовать классы "HttpWebRequest" и "HttpWebResponse" в .net.

Ниже приведен пример консольного приложения, которое я написал, чтобы продемонстрировать, насколько это просто.

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();
            }
        }
    }
}

Наслаждайтесь!

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...