ФорумПрограммированиеБольше языковC/C++ и C# → C# №2: Работа с сетью. Http

C# №2: Работа с сетью. Http

  • Frozzeg

    Сообщения: 5642 Репутация: N Группа: Джедаи

    Spritz 16 августа 2009 г. 6:27, спустя 36 дней 15 часов 57 минут

    В этой статье я расскажу как делать POST и GET запросы на сайты, сохранять сессию, а также скачивать файлы, показывая при этом прогресс загрузки.

    Программа загрузки файлов с веба.

    Необходимые библиотеки:

    //Классы для работы с сетью, в том числе и HTTP
    using System.Net;


    Об интерфейсе говорить я не буду, т.к. все сможете увидеть в исходниках.

    необходимые переменные

    //Переменная со ссылкой на файл, который будем скачивать
    string file_url = "http://www.bestwallpapers.net.ru/private/img/space/017_Space_bestwall.jpg";
    //Полный путь к директории, куда будем скачивать (вместе с названием файла)
    string saving_path = @"E:\downloaded_image.jpg";


    метод загрузки файла
    private void Downloader()
           {
              //создаем класс для работы с HTTP
               using (WebClient wClient = new WebClient())
               {
                   //Статус загрузки
                   label2.Text = "Скачивание…";
                   //Ссылка на скачивание
                   Uri url = new Uri(file_url);
                   //Начинаем асинхронную загрузку файла
                   wClient.DownloadFileAsync(url, saving_path);
                   //Добавляем события: событие завершения загрузки и событие изменения прогресса закачки.
                   wClient.DownloadFileCompleted += new AsyncCompletedEventHandler(DownloadFileCompleted);
                   wClient.DownloadProgressChanged += new DownloadProgressChangedEventHandler(DownloadProgressChanged);
               }
           }


    И обработчики событий

    Прогресс загрузки изменен

    public void DownloadProgressChanged(object sender, DownloadProgressChangedEventArgs e)
           {
               //Обновляем прогрессбар
               dl_progress.Value = e.ProgressPercentage;
           }

    Загрузка завершена

    public void DownloadFileCompleted(object sender, AsyncCompletedEventArgs e)
           {
               label2.Text = "Загрузка завершена.";
           }


    С закачкой файлов все. Остальное завтра напишу.





    Теперь давайте научимся делать POST запросы и при этом сохранять сессию. Делать запросы будем сюда http://frozzeg.no-ip.info/post.php.

    Скрипт на этой странице принимает 2 параметра, login и password, а параметр do_login остается пустым, по этому строка POST запроса будет выглядеть так:
    login=User&password=nevermind&do_login=


    Теперь перейдем к нашей программе.

    Вначале подключаем две библиотеки

    //Система ввода вывода
    using System.IO;
    //Работа с сетью
    using System.Net;


    Класс для хранения сессий
    private CookieCollection Cooks = new CookieCollection();


    И два метода

    Авторизация
    public string Request_Post()
           {
               HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("http://frozzeg.no-ip.info/post.php");
               // Разрешаем авторедирект
               httpWebRequest.AllowAutoRedirect = true;
               // Создаем для запроса новый контейнер для хранения сессий
               httpWebRequest.CookieContainer = new CookieContainer();
               // Следующие строки итак понятны
               httpWebRequest.Method = "POST";
               httpWebRequest.ContentType = "application/x-www-form-urlencoded";
               // Перед тем как заполнять поля формы, текст запроса конвертируем в байты
               byte[] ByteQuery = System.Text.Encoding.ASCII.GetBytes("login=User&password=nevermind&do_login=");
               // Длинна запроса (обязательный параметр)
               httpWebRequest.ContentLength = ByteQuery.Length;
               // Открываем поток для записи
               Stream QueryStream = httpWebRequest.GetRequestStream();
               // Записываем в поток (это и есть POST запрос(заполнение форм))
               QueryStream.Write(ByteQuery, 0, ByteQuery.Length);
               // Закрываем поток
               QueryStream.Close();
               // Объект с ответом сервера
               HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
               // Присваиваем сессию
               httpWebResponse.Cookies = httpWebRequest.CookieContainer.GetCookies(httpWebRequest.RequestUri);
               if (httpWebResponse.Cookies != null)
               {
                   // Добавляем сессию в наш контейнер для дальнейшего использования
                   Cooks.Add(httpWebResponse.Cookies);
               }
               // Открываем поток для чтения
               Stream stream = httpWebResponse.GetResponseStream();
               // Читаем из потока
               StreamReader reader = new StreamReader(stream);
               // Возвращаем результат запроса
               return reader.ReadToEnd();
           }


    И запрос с использованием сохраненной ранее сессии
    public string Request()
           {
               HttpWebRequest httpWebRequest = (HttpWebRequest)WebRequest.Create("http://frozzeg.no-ip.info/post.php");
               httpWebRequest.AllowAutoRedirect = true;
               httpWebRequest.CookieContainer = new CookieContainer();
               if (Cooks != null)
               {
                   //Добавляем к нашему запросу ранее сохраненную сессию
                   httpWebRequest.CookieContainer.Add(Cooks);
               }
               HttpWebResponse httpWebResponse = (HttpWebResponse)httpWebRequest.GetResponse();
               httpWebResponse.Cookies = httpWebRequest.CookieContainer.GetCookies(httpWebRequest.RequestUri);
               if (httpWebResponse.Cookies != null)
               {
                   //Обновляем сессию
                   Cooks.Add(httpWebResponse.Cookies);
               }
               Stream stream = httpWebResponse.GetResponseStream();
               StreamReader reader = new StreamReader(stream);
               return reader.ReadToEnd();
           }


    Писать я не умею и как излагать материал я не знаю, по этому просто решил написать и прокомментировать код.

    А запрос GET я решил не рассматривать, т.к. в любом учебнике есть его примеры.
    You can be anything you want to be. Just turn yourself into anything you think that you could ever be.
  • rider-sx

    Сообщения: 2717 Репутация: N Группа: Адекваты

    Spritz 9 июля 2009 г. 17:32, спустя 11 часов 4 минуты 54 секунды

    Ты мне на вопрос ак и не ответил!вижуал студио экспресс едишн подойдет или нет ?
  • Frozzeg

    Сообщения: 5642 Репутация: N Группа: Джедаи

    Spritz 9 июля 2009 г. 17:36, спустя 3 минуты 26 секунд

    подойдет, не заметил вопроса
    You can be anything you want to be. Just turn yourself into anything you think that you could ever be.
  • phpdude

    Сообщения: 26617 Репутация: N Группа: в ухо

    Spritz 9 июля 2009 г. 17:39, спустя 3 минуты 21 секунду

    string saving_path = @"E:\downloaded_image.jpg";


    сразу скажу))

    собака тут - не собака в пхп, тут она гвоорит о том, что строка после нее содержит неэкранированные слеши.

    string saving_path = "E:\\downloaded_image.jpg";

    string saving_path = @"E:\downloaded_image.jpg";

    одно и тоже, в пхп это проще, там есть ' которая этоже делает по сути
    Сапожник без сапог
  • Mr.Pihto

    Сообщения: ? Репутация: N Группа: Адекваты

    Spritz 9 июля 2009 г. 17:49, спустя 9 минут 41 секунду

    оп как пиздато)
  • phpdude

    Сообщения: 26617 Репутация: N Группа: в ухо

    Spritz 9 июля 2009 г. 17:52, спустя 2 минуты 55 секунд

    эх ..

    В этой статье я расскажу как делать POST и GET запросы на сайты, сохранять сессию, а также скачивать файлы, показывая при этом прогресс загрузки.
    имхо это самое интересное было )) {+++44+++} а сложное - например запустить из дополнительного потока скачку файла и при этом чере делегат пытаться отобразить это дело на прогрессбаре … получишь sync exception в 50 на 50 случаев … помню пытался, ой заебался … ))))))
    Сапожник без сапог
  • Frozzeg

    Сообщения: 5642 Репутация: N Группа: Джедаи

    Spritz 9 июля 2009 г. 17:53, спустя 1 минуту 42 секунды


    string saving_path = @"E:\downloaded_image.jpg";


    сразу скажу))

    собака тут - не собака в пхп, тут она гвоорит о том, что строка после нее содержит неэкранированные слеши.

    string saving_path = "E:\\downloaded_image.jpg";

    string saving_path = @"E:\downloaded_image.jpg";



    также собака автоматически заменяет перенос строки на '\r\n'

    string saving_path = "LOL1\r\nLOL2";

    string saving_path = @"LOL1
    LOL2";

    You can be anything you want to be. Just turn yourself into anything you think that you could ever be.
  • phpdude

    Сообщения: 26617 Репутация: N Группа: в ухо

    Spritz 9 июля 2009 г. 17:54, спустя 48 секунд

    Frozzeg, сенкс, не знал))
    Сапожник без сапог
  • Frozzeg

    Сообщения: 5642 Репутация: N Группа: Джедаи

    Spritz 9 июля 2009 г. 17:55, спустя 33 секунды

    это легко) я знаю кое какую фишку, о ней я расскажу в статье №3 Фишки и мелочи C# )
    You can be anything you want to be. Just turn yourself into anything you think that you could ever be.
  • adw0rd

    Сообщения: 22902 Репутация: N Группа: в ухо

    Spritz 9 июля 2009 г. 17:56, спустя 1 минуту 25 секунд

    сделал раздел, если не заметили
    adw/0
  • Frozzeg

    Сообщения: 5642 Репутация: N Группа: Джедаи

    Spritz 9 июля 2009 г. 17:57, спустя 32 секунды

    заметил) отлично, спс
    You can be anything you want to be. Just turn yourself into anything you think that you could ever be.
  • Mr.Pihto

    Сообщения: ? Репутация: N Группа: Адекваты

    Spritz 9 июля 2009 г. 17:59, спустя 2 минуты 10 секунд

    adw0rd, заметили) {+++37+++} блин весомая эта среда разроботки.( {+++28+++} пока скачаеца фрозег книгу напишет
  • Frozzeg

    Сообщения: 5642 Репутация: N Группа: Джедаи

    Spritz 9 июля 2009 г. 18:02, спустя 3 минуты

    так качай с торента, или у тебя со скоростью напряг?
    You can be anything you want to be. Just turn yourself into anything you think that you could ever be.
  • Mr.Pihto

    Сообщения: ? Репутация: N Группа: Адекваты

    Spritz 9 июля 2009 г. 18:04, спустя 2 минуты 33 секунды

    Frozzeg, с торента качаю, с максимальной скоростью.. 120 килобайт\сек
  • adw0rd

    Сообщения: 22902 Репутация: N Группа: в ухо

    Spritz 9 июля 2009 г. 18:08, спустя 4 минуты 7 секунд

    у меня минут 5 качается наверное
    adw/0

Пожалуйста, авторизуйтесь, чтобы написать комментарий!