Этот сайт не наркоманов. Это сайт программистов.

Добро пожаловать на Пыху!

Логин:
Пароль:
 

Нет прописки? Зарегистрируйся!

Новости

Пыха информатор 3.1
Еще более удобное оповещение о флуде!

Краснодарское время: 24 Май, 2012, 12:26:56

Страниц: [1] 2 3 ... 5
Печать
Автор Тема: C# №2: Работа с сетью. Http  (Прочитано 21336 раз)
0 Пользователей и 1 Гость смотрят эту тему.
Frozzeg    ↓ 
16 Август, 2009, 02:27:52
НЕ ХУЕТА! ХУЕТА!

Группа: Санитары

Карма: 92
Сообщений: 5497
Сила слова: 1.67

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

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

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

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

метод загрузки файла
C#
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);
            }
        }

И обработчики событий
 
Прогресс загрузки изменен
C#

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

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

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

 

 
Теперь давайте научимся делать POST запросы и при этом сохранять сессию. Делать запросы будем сюда http://frozzeg.no-ip.info/post.php.
 
Скрипт на этой странице принимает 2 параметра, login и password, а параметр do_login остается пустым, по этому строка POST запроса будет выглядеть так:
Text
login=User&password=nevermind&do_login=

Теперь перейдем к нашей программе.
 
Вначале подключаем две библиотеки
C#

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

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

И два метода
 
Авторизация
C#
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();
        }

И запрос с использованием сохраненной ранее сессии
C#
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 я решил не рассматривать, т.к. в любом учебнике есть его примеры.

* DownloadFileFromWeb.rar (36.06 Кб - загружено 416 раз.)
* HttpPostMethod.rar (37.82 Кб - загружено 459 раз.)
« Последнее редактирование: 16 Август, 2009, 02:27:52 от Frozzeg » Записан

Эксперт — это человек, который в узкой области допустил все возможные ошибки. © Нильс Бор.
Отложить на завтра — значит впасть в рекурсию. © Frozzeg
rider-sx    ↓ 
10 Июль, 2009, 01:32:46 , спустя
НЕ ХУЕТА! ХУЕТА!

drmmmmmm
Группа: Адекваты

Карма: 32
Сообщений: 2718
Сила слова: 1.18

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

Frozzeg    ↓ 
10 Июль, 2009, 01:36:12 , спустя 3 минуты 26 секунд
НЕ ХУЕТА! ХУЕТА!

Группа: Санитары

Карма: 92
Сообщений: 5497
Сила слова: 1.67

подойдет, не заметил вопроса
Записан

Эксперт — это человек, который в узкой области допустил все возможные ошибки. © Нильс Бор.
Отложить на завтра — значит впасть в рекурсию. © Frozzeg
phpdude    ↓ 
10 Июль, 2009, 01:39:33 , спустя 3 минуты 21 секунду
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 344
Сообщений: 20781
Сила слова: 1.66

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

сразу скажу))
 
собака тут - не собака в пхп, тут она гвоорит о том, что строка после нее содержит неэкранированные слеши.
 
string saving_path = "E:\\downloaded_image.jpg";
 
string saving_path = @"E:\downloaded_image.jpg";
 
одно и тоже, в пхп это проще, там есть ' которая этоже делает по сути
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
Mr.Pihto    ↓ 
10 Июль, 2009, 01:49:14 , спустя 9 минут 41 секунду
НЕ ХУЕТА! ХУЕТА!
не выябывайся
Группа: Адекваты

Карма: 17
Сообщений: 1398
Сила слова: 1.22

оп как пиздато)
Записан
phpdude    ↓ 
10 Июль, 2009, 01:52:09 , спустя 2 минуты 55 секунд
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 344
Сообщений: д-о-х-у-я!
Сила слова: 1.66

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

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
Frozzeg    ↓ 
10 Июль, 2009, 01:53:51 , спустя 1 минуту 42 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: Санитары

Карма: 92
Сообщений: 5497
Сила слова: 1.67


Javascript
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";
 
Записан

Эксперт — это человек, который в узкой области допустил все возможные ошибки. © Нильс Бор.
Отложить на завтра — значит впасть в рекурсию. © Frozzeg
phpdude    ↓ 
10 Июль, 2009, 01:54:39 , спустя 48 секунд
НЕ ХУЕТА! ХУЕТА!

я - ЭМО
Группа: в ухо

Карма: 344
Сообщений: 20781
Сила слова: 1.66

Frozzeg, сенкс, не знал))
Записан

забанен. могу забанить других, пишите в личку
BEER. Helping ugly people have sex since 1862.
Frozzeg    ↓ 
10 Июль, 2009, 01:55:12 , спустя 33 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: Санитары

Карма: 92
Сообщений: 5497
Сила слова: 1.67

это легко) я знаю кое какую фишку, о ней я расскажу в статье №3 Фишки и мелочи C# )
Записан

Эксперт — это человек, который в узкой области допустил все возможные ошибки. © Нильс Бор.
Отложить на завтра — значит впасть в рекурсию. © Frozzeg
adw0rd    ↓ 
10 Июль, 2009, 01:56:37 , спустя 1 минуту 25 секунд
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: в ухо

Карма: не нужна
Сообщений: 17615
Сила слова: 1.67

сделал раздел, если не заметили
Записан

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
Frozzeg    ↓ 
10 Июль, 2009, 01:57:09 , спустя 32 секунды
НЕ ХУЕТА! ХУЕТА!

Группа: Санитары

Карма: 92
Сообщений: 5497
Сила слова: 1.67

заметил) отлично, спс
Записан

Эксперт — это человек, который в узкой области допустил все возможные ошибки. © Нильс Бор.
Отложить на завтра — значит впасть в рекурсию. © Frozzeg
Mr.Pihto    ↓ 
10 Июль, 2009, 01:59:19 , спустя 2 минуты 10 секунд
НЕ ХУЕТА! ХУЕТА!
не выябывайся
Группа: Адекваты

Карма: 17
Сообщений: 1398
Сила слова: 1.22

adw0rd, заметили)
Спустя 37 секунд добавил
блин весомая эта среда разроботки.(
Спустя 28 секунд добавил
пока скачаеца фрозег книгу напишет
Записан
Frozzeg    ↓ 
10 Июль, 2009, 02:02:19 , спустя 3 минуты
НЕ ХУЕТА! ХУЕТА!

Группа: Санитары

Карма: 92
Сообщений: 5497
Сила слова: 1.67

так качай с торента, или у тебя со скоростью напряг?
Записан

Эксперт — это человек, который в узкой области допустил все возможные ошибки. © Нильс Бор.
Отложить на завтра — значит впасть в рекурсию. © Frozzeg
Mr.Pihto    ↓ 
10 Июль, 2009, 02:04:52 , спустя 2 минуты 33 секунды
НЕ ХУЕТА! ХУЕТА!
не выябывайся
Группа: Адекваты

Карма: 17
Сообщений: 1398
Сила слова: 1.22

Frozzeg, с торента качаю, с максимальной скоростью.. 120 килобайт\сек
Записан
adw0rd    ↓ 
10 Июль, 2009, 02:08:59 , спустя 4 минуты 7 секунд
НЕ ХУЕТА! ХУЕТА!

эдво
Группа: в ухо

Карма: не нужна
Сообщений: 17615
Сила слова: 1.67

у меня минут 5 качается наверное
Записан

Python, Django, Git, Emacs, Nginx, MySQL, SphinxSearch, FreeBSD/Linux
Мой блог * Кинсбург * Либург * Я на GitHub
Страниц: [1] 2 3 ... 5
Печать
 

Перейти в:  

Этот топик скрыли: adw0rd, Sinkler