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

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

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

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

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

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

Протокол – сводка правил и методов, по которым будут передаваться данные между узлами сети. Протокол обеспечивает способ передачи информации и обработку ошибок.

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

# Уровень Примеры протоколов
Прикладной (Application layer) HTTP, SMTP, FTP, DNS
Транспортный (Transport layer) TCP, UDP
Сетевой (Internet layer) IP
Канальный (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, ftp, pop3, smtp, tcp, udp…).

Протокол – сводка правил и методов, по которым будут передаваться данные между узлами сети. Протокол обеспечивает способ передачи информации и обработку ошибок.

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

# Уровень Примеры протоколов
Прикладной (Application layer) HTTP, SMTP, FTP, DNS
Транспортный (Transport layer) TCP, UDP
Сетевой (Internet layer) IP
Канальный (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 и базовая работа с ним в Си-шарп.

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

В таблице 1 приведены распространенные коды состояния:

Таблица 1

Код Описание
Хорошо. Успешный запрос
Запрошенный ресурс был окончательно перенесен на новый URI
Запрошенный ресурс был временно перенесен на другой URI
Неверный запрос - запрос не понят сервером из-за наличия синтаксической ошибки
Несанкционированный доступ — у пользователя нет прав для доступа к запрошенному документу.
Не найдено - сервер понял запрос, но не нашёл соответствующего ресурса по указанному URI
Время ожидания сервером передачи от клиента истекло
Внутренняя ошибка сервера—ошибка помешала 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-код, который браузер потом будет отображать. Тело обязательно отделяется от заголовков пустой строкой.

Теперь перейдем к программированию.

Наши рекомендации