Автор работы: Пользователь скрыл имя, 29 Марта 2012 в 23:39, реферат
Для общения клиент – сервер, для обмена, используется технология сокетов. Через сокеты передаются массивы байт, которые в свою очередь содержат коды символов. В зависимости от браузера будет использована та или иная кодировка ( рекомендуемая UTF-8, так как она присутствует на любой операционной системе).
Сокеты – это абстрактный объект, являющийся представляющий точку соединения. Существуют сокеты двух видов – серверный (слушающий), который привязывается к порту операционной системы и ожидающий пока на данный порт придет запрос, и клиентский, который передает сообщение.
Лабораторная работа
«Построение собственного http сервера»
Начальные сведения:
Для общения клиент – сервер, для обмена, используется технология сокетов. Через сокеты передаются массивы байт, которые в свою очередь содержат коды символов. В зависимости от браузера будет использована та или иная кодировка ( рекомендуемая UTF-8, так как она присутствует на любой операционной системе).
Сокеты – это абстрактный объект, являющийся представляющий точку соединения. Существуют сокеты двух видов – серверный (слушающий), который привязывается к порту операционной системы и ожидающий пока на данный порт придет запрос, и клиентский, который передает сообщение.
При создании http сервера требуются оба вида сокетов, в связи с тем, что процедура обмена сообщениями связаны как с получением сообщения, так и с его отправкой.
Данная схема изображена на рисунке:
В данной лабораторной работе клиентом будет выступать браузер, а в роли сервера – написанная программа. Их размещение не так важно, так как механизм сокетов может работать как внутри одной машины, так и на разных машинах через локальную сеть, либо интернет.
Форматы запросов и ответ закреплены в описании http. Текущая версия протокола 1.1
Протокол описывается в RFC 1945, RFC 2616.
Общая схема построения запроса:
Запрос можно передавать только в таком порядке. Стартовая строка – является обязательным атрибутом любого http запроса, в то время заголовок и тело сообщения могут отсутствовать.
Стартовая строка различна для запросов и ответов.
Для запроса она имеет вид:
Метод URI HTTP/Версия
Метод – это действие, которое клиент хочет совершить, может состоять из любых символов, кроме управляющих и пробелов.
URI – путь к запрашиваемому документу.
Версия – две арабские цифры, разделенные точкой
Для ответа:
HTTP/Версия КодСостояния Пояснение
Версия – две арабские цифры, разделенные точкой.
КодСостояния – три арабские цифры. По коду статуса определяется дальнейшее содержимое сообщения и поведение клиента.
Пояснение – текстовое короткое пояснение к коду ответа для пользователя. Никак не влияет на сообщение и является необязательным.
Методов у клиента достаточно много, для лабораторной потребуется только два:
GET
Используется для запроса
HEAD
Аналогичен методу GET, за исключением того, что в ответе сервера отсутствует тело.
Эти методы являются обязательными для реализации на любом http сервере.
Заголовки это строки в HTTP-сообщении, содержащие разделённую двоеточием пару параметр-значение. Формат заголовков соответствует общему формату заголовков текстовых сетевых сообщений ARPA (RFC 822). Заголовки должны отделяться от тела сообщения хотя бы одной пустой строкой.
Тело сообщения если оно присутствует, используется для передачи тела объекта, связанного с запросом или ответом. В нашем случае, оно будет использовано для передачи клиенту содержимого html страницы, либо картинок.
Теперь рассмотрим такой пример общения:
Браузер делает запрос серверу
GET
/index.html HTTP/1.1
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 — небольшой фрагмент данных, созданный веб-сервером и хранимый на компьютере пользователя в виде файла, который веб-клиент каждый раз пересылает веб-серверу в запросе при попытке открыть страницу соответствующего сайта. Применяется для сохранения данных на стороне пользователя, на практике обычно используется для:
Установка cookie
GET /index.html HTTP/1.1 |
||
Браузер |
→ |
сервер |
HTTP/1.1 200 OK |
||
браузер |
← |
сервер |
GET /spec.html HTTP/1.1 |
||
браузер |
→ |
сервер |
Этот запрос отличается от первого запроса тем, что содержит строку, которую сервер отправил браузеру ранее. Таким образом, сервер узна́ет, что этот запрос связан с предыдущим. Сервер отвечает, отправляя запрашиваемую страницу и, возможно, добавив новые куки.
Значение куки может быть изменено сервером путём отправления новых строк Set-Cookie: name=newvalue. После этого браузер заменяет старое куки с тем же name на новую строку.
Формулировка задания:
Требуется создать http сервер, который будет давать браузеру страницы. Корректно отвечать на запросу GET и HEAD. Должны быть также реализованы cookie и хотя бы одна закрытая страница, которая будет отображаться только авторизованным пользователям. В случае запроса не существующей страницы выдавать страницу с ошибкой 404. Реализовать обработку различных браузеров отображая им разное содержимое, для этого создать альтернативные страницы, которые будут передаваться определенному типу браузеров. Для хранения страниц использовать папку, которую будет индексировать сервер при запуске.
Выводить действия сервера на консоль, либо в файл логов.
Дополнительные сведения:
Каждому серверному сокету нужно сообщить порт, на котором он будет принимать соединения. Порты с номерами 0 – 1023 в большинстве операционных систем являются служебными, поэтому нужно использовать порты из диапазона 1024-65535.
Хранить пары логин-пароль можно внутри самой программы, так как методы авторизации интересуют нас меньше чем организация обмена данными по сети.
Для обмена данными потребуется:
Пример на Java:
//Создаем серверный сокет и приписываем ему порт 8080
ServerSocket ss = new ServerSocket(8080);
//Принимает соединение, а порожденный им сокет передаем в s
Socket s = ss.accept();
Далее из сокета мы можем получить входной и выходной потоки, которые и будем использовать для передачи. Из входного потока надо получить последовательность байт (можно записать её в String) распарсить её в соответствии с форматом запросов и понять, что же нужно клиенту.
Так как в работе используются клиенты не собственного описания, поэтому стоит учитывать, что браузер при запросе страницы будет пытаться сделать запрос на иконку страницы (favicon.ico) можно игнорировать данный запрос, либо создать в блокноте картинку 16х16, сохранить её в формате bmp, а потом сменить её расширение на ico.
Так же современные бразеры не так критичны к html страницам – можете забыть закрыть скобку, писать неправильный Content-type при ответе – браузер все равно отобразит то, что вы ему передали, но не факт что верно.
Контрольные вопросы: