Построение собственного http сервера

Автор работы: Пользователь скрыл имя, 29 Марта 2012 в 23:39, реферат

Описание работы

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

Файлы: 1 файл

Лабораторная работа.docx

— 27.67 Кб (Скачать файл)

Лабораторная  работа

«Построение собственного http сервера»

Начальные сведения:

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

Сокеты – это абстрактный объект, являющийся представляющий точку соединения. Существуют сокеты двух видов – серверный (слушающий), который привязывается к порту операционной системы и ожидающий пока на данный порт придет запрос, и клиентский, который передает сообщение.

При создании http сервера требуются оба вида сокетов, в связи с тем, что процедура обмена сообщениями связаны как с получением сообщения, так и с его отправкой.

Данная схема изображена на рисунке:


 


 

 

 

 

 

 

 

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

 

Форматы запросов и ответ закреплены в описании http. Текущая версия протокола 1.1

Протокол описывается в RFC 1945, RFC 2616.

Общая схема построения запроса:

  1. Стартовая строка — определяет тип сообщения;
  2. Заголовки — характеризуют тело сообщения, параметры передачи и прочие сведения;
  3. Тело сообщения — непосредственно данные сообщения. Обязательно должно отделяться от заголовков пустой строкой.

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

Стартовая строка различна для запросов и ответов.

 Для запроса  она имеет вид:

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

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

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

Версия – две арабские цифры, разделенные точкой

Для ответа:

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

Версия – две арабские цифры, разделенные точкой.

КодСостояния – три арабские цифры. По коду статуса определяется дальнейшее содержимое сообщения и поведение клиента.

Пояснение – текстовое короткое пояснение к коду ответа для пользователя. Никак не влияет на сообщение и является необязательным.

Методов у клиента достаточно много, для лабораторной потребуется только два:

GET

Используется для запроса содержимого  указанного ресурса

HEAD

Аналогичен методу GET, за исключением того, что в ответе сервера отсутствует тело.

Эти методы являются обязательными  для реализации на любом http сервере.

Заголовки это строки в HTTP-сообщении, содержащие разделённую двоеточием пару параметр-значение. Формат заголовков соответствует общему формату заголовков текстовых сетевых сообщений ARPA (RFC 822). Заголовки должны отделяться от тела сообщения хотя бы одной пустой строкой.

Тело сообщения если оно присутствует, используется для передачи тела объекта, связанного с запросом или ответом. В нашем случае, оно будет использовано для передачи клиенту содержимого html страницы, либо картинок.

Теперь рассмотрим такой пример общения:

Браузер делает запрос серверу

GET /index.html HTTP/1.1                                                   //Запрос страницы index.html

Host: localhost:8080                                                             //Адрес, где находится страница

 

На этот запрос сервер ответит

HTTP/1.1 200 OK                                                                      //Сервер отвечает что ресурс                                   

                                                                                                     // доступен и отдает его содержимое

Server: MyServer                                                                     //Имя сервера

Content-Type: text/html                                                        //Тип содержимого

Content-Length: 49                                                                  //Количество символов в теле

 

<html><body><h1>Hello page</h1></body></html>     //Тело сообщения

 

Cookie — небольшой фрагмент данных, созданный веб-сервером и хранимый на компьютере пользователя в виде файла, который веб-клиент каждый раз пересылает веб-серверу в запросе при попытке открыть страницу соответствующего сайта. Применяется для сохранения данных на стороне пользователя, на практике обычно используется для:

  1. аутентификации пользователя;
  2. хранения персональных предпочтений и настроек пользователя;
  3. отслеживания состояния сессии доступа пользователя;
  4. ведения статистики о пользователях.

Установка cookie 

  1. Запрашивая страницу, браузер отправляет веб-серверу короткий текст с HTTP-запросом. Например, для доступа к странице http://www.example.org/index.html, браузер отправляет на сервер www.example.org следующий запрос:
 

GET /index.html HTTP/1.1 
Host: www.example.org

 

Браузер

сервер


  1. Сервер отвечает, отправляя запрашиваемую страницу вместе с текстом, содержащим HTTP-ответ. Там может содержаться указание браузеру сохранить куки:
 

HTTP/1.1 200 OK 
Content-type: text/html 
Set-Cookie: name=value 
  
(содержимое страницы)

 

браузер

сервер


  1. Строка Set-cookie отправляется лишь тогда, когда сервер желает, чтобы браузер сохранил куки. В этом случае, если куки поддерживаются браузером и их приём включён, браузер запоминает строку name=value (имя = значение) и отправляет её обратно серверу с каждым последующим запросом. Например, при запросе следующей страницы http://www.example.org/spec.html браузер пошлёт серверу www.example.org следующий запрос:
 

GET /spec.html HTTP/1.1 
Host: www.example.org 
Cookie: name=value 
Accept: */* 
 

 

браузер

сервер


Этот запрос отличается от первого запроса тем, что содержит строку, которую сервер отправил браузеру ранее. Таким образом, сервер узна́ет, что этот запрос связан с предыдущим. Сервер отвечает, отправляя запрашиваемую страницу и, возможно, добавив новые куки.

Значение куки может быть изменено сервером путём отправления новых строк Set-Cookie: name=newvalue. После этого браузер заменяет старое куки с тем же name на новую строку.

 

Формулировка  задания:

Требуется создать http сервер, который будет давать браузеру страницы. Корректно отвечать на запросу GET и HEAD. Должны быть также реализованы cookie и хотя бы одна закрытая страница, которая будет отображаться только авторизованным пользователям. В случае запроса не существующей страницы выдавать страницу с ошибкой 404. Реализовать обработку различных браузеров отображая им разное содержимое, для этого создать альтернативные страницы, которые будут передаваться определенному типу браузеров. Для хранения страниц использовать папку, которую будет индексировать сервер при запуске.

Выводить действия сервера  на консоль, либо в файл логов.

 

Дополнительные сведения:

Каждому серверному сокету нужно сообщить порт, на котором он будет принимать соединения. Порты с номерами 0 – 1023 в большинстве операционных систем являются служебными, поэтому нужно использовать порты из диапазона 1024-65535.

Хранить пары логин-пароль можно внутри самой программы, так как методы авторизации интересуют нас меньше чем организация обмена данными  по сети.

Для обмена данными потребуется:

  1. Создать серверный сокет
  2. Задать ему порт и прослушивать его (программа будет его прослушивать до тех пор пока на данный порт не придут какие-либо данные)
  3. Передать клиентский сокет, который будет порожден соединением.
  4. Запустить обработку полученного пакета в новом потоке
  5. Передать ответ обратно

Пример на Java:

//Создаем серверный сокет и приписываем ему порт 8080

ServerSocket ss = new ServerSocket(8080);

//Принимает соединение, а порожденный им сокет передаем в s

Socket s = ss.accept();

 

Далее из сокета мы можем получить входной и выходной потоки, которые и будем использовать для передачи. Из входного потока надо получить последовательность байт (можно записать её в String) распарсить её в соответствии с форматом запросов и понять, что же нужно клиенту.

Так как в работе используются клиенты  не собственного описания, поэтому стоит учитывать, что браузер при запросе страницы будет пытаться сделать запрос на иконку страницы (favicon.ico) можно игнорировать данный запрос, либо создать в блокноте картинку 16х16, сохранить её в формате bmp, а потом сменить её расширение на ico.

Так же современные бразеры не так критичны к html страницам – можете забыть закрыть скобку, писать неправильный Content-type при ответе – браузер все равно отобразит то, что вы ему передали, но не факт что верно.

 

Контрольные вопросы:

  1. Какие протоколы были использованы в данной лабораторной работе?
  2. Что будет общего, а что различно в реализации клиента и сервера на основе сокетов?
  3. После реализации работоспособного сервера, попробуйте на одной из страниц вставить ссылки на картинки, одну хранящуюся на вашем веб-сервере и на другую, хранящуюся на стороннем веб-сервере, каков будет результат запроса этой страницы?

Информация о работе Построение собственного http сервера