Архитектура Аудит Военная наука Иностранные языки Медицина Металлургия Метрология
Образование Политология Производство Психология Стандартизация Технологии


Сетевое программирование в Си-шарп



Несколько следующих уроков будут посвящены теме сетевого программирования. Это достаточно большая область программирования, и для начала ее освоения необходимо разобраться с базовыми понятиями и терминологией.

Компьютерная сеть – это система компьютеров, или другого вычислительного оборудования, которые объединены между собой теми или иными каналами связи, и могут обмениваться между собой информацией.

Сети классифицируются по такому признаку как архитектура. Наиболее распространенная архитектура «клиент-сервер», о которой многие не раз уже слышали.

Рассмотрим аналогию архитектуры клиент-сервер в ситуации из жизни. Человек идет в магазине за хлебом. В данном случае клиентом выступает покупатель, который говорит, что хочет купить хлеб (запрашивает некий ресурс, услугу). Продавец в этой ситуации выступает сервером, который обрабатывает запрос (какой продукт, деньги заплатили, или нет), и выдает ответ (хлеб если заплатили, или до свидания). Покупателей много – клиентов, и всех обслуживает один продавец – сервер.

Физически клиентом и сервером могут выступать компьютеры и программное обеспечение. Обмен данными между клиентом и сервером осуществляется посредством сетевых протоколов (http, ftp, pop3, smtp, tcp, udp…).

Протокол – сводка правил и методов, по которым будут передаваться данные между узлами сети. Протокол обеспечивает способ передачи информации и обработку ошибок.
Протоколы делятся на уровни по своему назначению. В современных сетях используется так называемый стек протоколов TCP/IP. Он имеет 4 уровня. Стек означает то, что протокол, который располагается выше по уровню, не знает и не имеет необходимости знать, как именно осуществляется передача данных протоколом нижнего уровня, используя механизм инкапсуляции.

# Уровень Примеры протоколов
4 Прикладной (Application layer) HTTP, SMTP, FTP, DNS
3 Транспортный (Transport layer) TCP, UDP
2 Сетевой (Internet layer) IP
1 Канальный (Link layer) Ethernet, IEEE 802.11 Wireless Ethernet

 

Работу стека протоколов можно описать следующей ситуацией. Один начальник компании хочет передать посылку другому начальнику компании. Первый сообщает второму, что пришлет посылку, и второй одобряет. Эти договоренности начальников происходили посредством протокола наивысшего уровня в стеке. Дальше первый начальник сообщает секретарю, что надо сделать и этот секретарь связывается с секретарем второго начальника и говорит «ожидайте курьера, который доставит посылку». Общение секретарей было уже протоколом ниже в стеке. Дальше секретарь вызывает курьера и говорит, что и куда доставить, и тот уже на самом нижнем уровне стека осуществляет передачу данных. Добраться до второй компании он может разными способами - пешком, такси, на рабочем автомобиле. В этой ситуации секретарю (протоколу выше) без разницы, как доберется курьер до места назначения, также как и начальнику не нужно ничего знать про то, как секретари договорятся доставить посылку (может другим способом, не курьером). Это демонстрирует нам механизм инкапсуляции.

Если брать сеть Интернет (WWW), то в качестве клиента выступает веб-браузер, а сервером является веб-сервер. Веб-сервер - это компьютер, на котором установлено программное обеспечение, которое реализует необходимый серверный функционал. В интернете обмен данными происходит посредством протокола HTTP (HyperText Transfer Protocol) – протокол передачи гипертекста. Вы вводите в строке браузера имя страницы, браузер делает запрос к веб-серверу, веб-сервер обрабатывает запрос и возвращает страницу.

Электронная почта (email) – еще один способ передачи данных (электронных писем) между компьютерами, объединенными в сеть. Есть сервер электронной почты, и его клиенты. Когда клиент1 отправляет почту клиенту2, она посредством протокола SMTP отправляется на сервер. Клиент2 же получает почту с сервера используя протокол POP3.

Следующие несколько уроков будут посвящены работе в сети с протоколами прикладного уровня, что на данном этапе обучения будет наиболее полезно и актуально.

В платформе .Net для работы с сетью существует пространство имен System.Net;
Это пространство имен предоставляет классы для работы со многими протоколами передачи данных, классы описывающие запрос (WebRequest) к серверу, ответ (WebResponse), класс веб-клиента WebClient, который обеспечивает обмен данными с ресурсом, по заданному URI, классы IP адреса, авторизации, «куков» и многое другое. Более детально всё это будет рассмотрено в соответствующих уроках.
Сетевое программирование очень широкая тема, тут парочкой уроков не обойдешься, и всё я охватывать пока не собираюсь, но самое актуальное и необходимое будет рассмотрено.

 

Протокол HTTP в Си-Шарп. Классы HttpWebRequest и HttpWebResponse
HTTP (HyperText Transfer Protocol) – это протокол передачи данных (изначально гипертекстовых данных в формате HTML, потом произвольных данных) прикладного уровня, используемый в World Wide Web (WWW).
Протокол HTTP работает по технологии клиент-сервер. Клиентом обычно выступает веб-браузер, а сервером – веб-сервер. Клиент формирует и делает запрос к серверу, и тот, обработав запрос, возвращает ответ клиенту.
Объектом, над которым происходит работа протокола HTTP, является ресурс, на который указывает URI в запросе клиента. URI (Uniform Resource Identifier) – унифицированный идентификатор ресурса, простыми словами, это то, что указывается в строке браузера – имя запрашиваемого ресурса (страница, изображение, и т.д.).

Структура HTTP-сообщения имеет следующий вид:

[стартовая-строка]
[заголовок-сообщения1]
[заголовок-сообщения2]

[тело-сообщения]

 

Стартовая строка для запроса и ответа отличаются.
Для запроса она имеет такую структуру:

[Метод] [URI] HTTP/[Версия]

 

Здесь метод – название запроса, одно слово заглавными буквами, наиболее часто используются GET, POST, HEAD.

URI – идентификатор запрашиваемого ресурса.

Версия – цифры, разделенные точкой (например 1.1).

Для главной страницы этого сайта стартовая строка будет иметь такой вид:

GET / HTTP/1.1

 

Для ответа стартовая строка выглядит так:

HTTP/Версия [Код Состояния] [Пояснение]

 

Код Состояния – это трехзначный цифровой код, который определяет результат запроса. Например, если клиент запросил при помощи метода GET некий ресурс, и сервер его смог предоставить, такое состояние имеет код 200. Если же на сервере нет запрашиваемого ресурса, он вернет код состояния 404. Есть и много других состояний.

Пояснение – это текстовое отображение кода состояния, для упрощенного понимания человека. Для кода 200 пояснение имеет вид «OK».

Ответ на запрос главной страницы сайта имеет такой вид:

HTTP/1.1 200 OK

 

Код Описание
200 Хорошо. Успешный запрос
301 Запрошенный ресурс был окончательно перенесен на новый URI
302 Запрошенный ресурс был временно перенесен на другой URI
400 Неверный запрос - запрос не понят сервером из-за наличия синтаксической ошибки
401 Несанкционированный доступ — у пользователя нет прав для доступа к запрошенному документу.
404 Не найдено - сервер понял запрос, но не нашёл соответствующего ресурса по указанному URI
408 Время ожидания сервером передачи от клиента истекло
500 Внутренняя ошибка сервера—ошибка помешала HTTP-серверу обработать запрос

 

HTTP-заголовки
Заголовки HTTP – это строки в HTTP-сообщении в формате «имя: значение». Другими словами их можно назвать метаданными (информация об используемых данных) HTTP-сообщения.

Заголовки делятся на те, которые используются в запросах, на те которые включаются в ответы, и на те, которые могут быть как запросе, так и в ответе.

Заголовки запросов
Заголовок Referer – URI ресурса, с котрого клиент сделал запрос на сервер. Перейдя со страницы1 на страницу2, Referer будет содержать адрес страницы1. Этот заголовок может быть полезным, например, для того, чтобы отследить по каким поисковым запросам посетители попали на ваш сайт. Или сервер может как либо иначе обрабатывать запрос, если Referer не тот, который ожидается.

Перейдя с главной страницы сайта на любую другую страницу, Referer будет выглядеть так:

Referer: http://mycsharp.ru/

 

Заголовок Accept используется для того, чтобы клиент сообщил серверу, какие типы контента он поддерживает. Типы указываются в формате тип/подтип через запятую:

Accept: text/html, text/plain, image/jpeg
Accept: image/jpg, image/gif

Если тип не может быть обработан, возвращается HTTP-код 406 «Not acceptable».
Заголовок User-Agent содержит информацию о клиентском приложении. Обычно это имя браузера, его версия и платформу. В первую очередь этот заголовок нужен для корректного отображения страницы. Браузеров есть много, много версий и не все могут одинаково отображать контент, web-программисты учитывают эту информацию и выдают различным браузерам различные скрипты/стили:

User-Agent: Mozilla/5.0 (Windows NT 5.1; rv:37.0) Gecko/20100101 Firefox/37.0
Заголовок Content-length содержит длину передаваемых данных в байтах при использовании метода передачи POST. При методе GET он не устанавливается.

Content-Length: 2803


Заголовки ответов
Заголовок Server содержит информацию о программном обеспечении, которое использует сервер:

Server: Microsoft-IIS/7.0
Заголовок Content-Type указывает тип данных, которые отправляются клиенту, или которые могли бы отправиться, используя метод HEAD.

Content-Type : text/html; charset=utf-8
Content-Type : text/plain
Content-Type: image/jpeg


Общие заголовки
Заголовок Date указывает дату и время создания сообщения:

Date: Mon, 06 Apr 2015 17:09:39 GMT
Заголовок Content-Language содержит список языков, для которых предназначается контент.

Content-Language: en, ru

Тело HTTP cообщения
Тело (message-body) используется для передачи тела объекта, связанного с запросом или ответом. Обычно это сгенерированный html-код, который браузер потом будет отображать. Тело обязательно отделяется от заголовков пустой строкой.

Классы HttpWebRequest и HttpWebResponse
Платформа .NET Framework для работы с протоколом HTTP предоставляет два основных класса. Один из них отвечает за запрос – класс HttpWebRequest, а другой за ответ – HttpWebResponse.

пример простой программы, с использованием данных классов, которая получает из интернета указанную страничку:

static void Main()
{
string uri = "http://mycsharp.ru/post/49/2015_03_02_setevoe_programmirovanie_v_si-sharp.html";
HttpWebRequest request = (HttpWebRequest)WebRequest.Create(uri);
HttpWebResponse response = (HttpWebResponse)request.GetResponse();
StreamReader reader = new StreamReader(response.GetResponseStream(), Encoding.UTF8);
Console.WriteLine(reader.ReadToEnd());
Console.ReadLine();
}


Сначала создается объект запроса при помощи статического метода Create класса WebRequest, в который передается адрес запрашиваемого ресурса. При этом возвращаемый объект необходимо привести к типу HttpWebRequest, потому как метод Create возвращает различный объект запроса, основываясь на том, какой URI ему передали, это может быть, как в нашем случае, HTTP запрос, так и запрос к файловой системе (при этом возвращается объект FileWebRequest).
Дальше мы создаем объект ответа HttpWebResponse путем вызова метода GetResponse у объекта запроса (при этом приводим его к типу HttpWebResponse). При вызове этого метода, на сервер отправляется запрос, и в результате мы получаем объект HttpWebResponse который содержит HTTP-заголовки, а также поток, с которого мы можем считать тело ответа.
Дальше создается объект чтения потока StreamReader, в его конструктор передается поток ответа, который возвращает метод GetResponseStream, указываем необходимую кодировку, и выводим данные на экран. В результате мы увидим HTML код запрашиваемой страницы.

Работа с HTTP-заголовками
Для работы с заголовками у обоих классов HttpWebRequest и HttpWebResponseесть свойство Headers (объект типа WebHeaderCollection) которое предоставляет информацию о заголовках запроса и ответа соответственно. Для добавления или установки заголовков используются методы Add и Set. Метод Add принимает один строковый аргумент – заголовок полностью в формате "имя: значение":

request.Headers.Add("Content-Language: en, ru");


Метод Set принимает два строковых аргумента – имя и значение:

request.Headers.Set("Content-Language", "en, ru");


Использовать можно любой из этих методов, но кроме такой "ручной" установки заголовков есть еще возможность задать значения некоторых распространенных заголовков, используя соответствующие свойства в классах HttpWebRequest и HttpWebResponse. Например, установка заголовка Referer:

request.Referer = "http://google.com"

Доступ к конкретному заголовку осуществляется при помощи той же коллекции Headers (коллекция пар имя-значение WebHeaderCollection). В квадратных скобках указываем имя заголовка, и получаем его значение:

Console.WriteLine(response.Headers["date"]); // Tue, 07 Apr 2015 17:29:04 GMT

Считать все заголовки можно так:

foreach(string header in response.Headers)
Console.WriteLine("{0}: {1}", header, response.Headers[header]);


Вывод будет таким:

Content-Length: 77352
Cache-Control: private
Content-Type: text/html; charset=utf-8
Date: Tue, 07 Apr 2015 17:29:04 GMT
Set-Cookie: ASP.NET_SessionId=3nq4lu3qep3bb3vj2gnhmqdf; path=/; HttpOnly
Server: Microsoft-IIS/7.0
X-AspNet-Version: 4.0.30319
X-Powered-By: ASP.NET

 

В примерах выше все запросы выполнялись методом "GET".У классов HttpWebRequest и HttpWebResponse есть свойство Method. Для запроса оно по умолчанию установлено как "GET", но его можно изменить, например на "POST", об этом методе и будет следующий урок. Для ответа же это свойство только на чтение.

 

 


Поделиться:



Последнее изменение этой страницы: 2019-03-22; Просмотров: 272; Нарушение авторского права страницы


lektsia.com 2007 - 2024 год. Все материалы представленные на сайте исключительно с целью ознакомления читателями и не преследуют коммерческих целей или нарушение авторских прав! (0.033 с.)
Главная | Случайная страница | Обратная связь