В этом блоге объясняется базовое понимание HTTP, модели клиент-сервер, сетевых уровней и некоторых аспектов программирования сокетов в Java.

Содержание

  1. Роли в Интернете
  2. Общий язык
  3. Мягкие слои
  4. Кодирование
    4.1. Основные файлы и структура проекта
    4.2. Создание сокета и прослушивание новых подключений
    4.3. Создание класса Connection
    4.4. Обработка HTTP-запроса клиента и отправка HTTP-ответа с сервера
    4.5. Некоторые вспомогательные методы
    4.6. Компиляция файла WebServer.java
  5. "Заключение"

Роли в Интернете

Разработчики и дизайнеры могут выбирать различные устройства и архитектуру для своих компьютеров для разработки интернет-сервиса. В этой статье мы говорим о наиболее часто используемой модели client-server. В этой модели в основном две роли:

  1. клиент: компьютер-клиент инициирует запрос ресурсов и информации с компьютера-сервера.
  2. сервер: серверный компьютер обрабатывает запрос клиента и отвечает соответствующей информацией.

Общий язык

Для общения между клиентом и сервером необходим общий язык. Мы можем разработать и использовать любой язык, который пожелаем, чтобы заставить эти компьютеры общаться друг с другом. Но чтобы сделать его пригодным для использования, совместимым и широко доступным, нам нужен стандартизированный язык (также известный как протокол). Здесь на помощь приходит протокол HTTP.

  1. Протокол HTTP определяет структуру сообщений запроса и ответа. Это похоже на отправку посылки вашему другу с адресом, состоящим из названия улицы, названия города, названия штата, почтового индекса и кода страны.
  2. HTTP определяет операции, которые могут быть выполнены с данным ресурсом. Они называются методами HTTP-запроса. Их также называют глаголами HTTP. Некоторые примеры:
  • Метод GET запрашивает представление/состояние указанного ресурса/данных. Он должен только получать данные.
  • Метод POST отправляет сущность указанному ресурсу, что часто вызывает изменение на сервере.

3. Протокол HTTP также определяет различные наборы кодов состояния для обозначения различных состояний, которые могут возникать во время связи, таких как успешные ответы (200–299), ответы об ошибках клиента (400–499), ответы об ошибках сервера (500–599) и т. д.

4. HTTP-запросы и ответы имеют схожую структуру и состоят из:

  • Единая начальная строка, описывающая запросы/ответы, которые должны быть реализованы, или их состояние: успешное или неудачное.
  • Необязательный набор заголовков HTTP, определяющих запрос/ответ или описывающих тело, включенное в сообщение.
  • Пустая строка, указывающая, что вся метаинформация для запроса отправлена.
  • Необязательное тело, содержащее данные, связанные с запросом (например, содержимое HTML-формы), или документ, связанный с ответом. Наличие тела и его размер определяется стартовой строкой и заголовками HTTP.

Мягкие слои

Модель программного обеспечения Интернета может быть определена двумя типами многоуровневых моделей: модель OSI (только для справки) и комплект протоколов Интернета (практически реализуется и используется в Интернете). . Не вдаваясь в подробности, основные моменты таковы:

  • Каждый компьютер (клиент или сервер) и сетевое устройство, поддерживающее Интернет, реализует модель пакета IP.
  • Эти модели структурированы как слои, поэтому мы говорим, что модель имеет многоуровневую структуру.
  • Каждый слой несет свою ответственность и скрывает свою реализацию (внутреннюю работу) от других слоев.
  • Каждый уровень обеспечивает интерфейс со слоями непосредственно над или под ним.

Примечание.

В модели пакета IP уровеньприложенияобъединяет все три уровня модели OSI, т. е.приложение+представление+ Сессия

В модели пакета IP уровеньLinkобъединяет два нижних уровня модели OSI, т. е.физический+канал передачи данных.

Самый нижний уровень каждой модели подключается к физическим сетевым устройствам, таким как маршрутизаторы, коммутаторы и т. д.

HTTP относится к уровню приложения, который доступен пользовательскому процессу. Протокол HTTP использует службы, предоставляемые уровнем Transport (TCP или UDP), для установления и осуществления связи с другими компьютерами в Интернете. Но чтобы склеить эти два уровня вместе, операционная система предоставляет интерфейс, называемый API сокетов. Программирование, использующее API сокетов, называется программированием сокетов.

Розетка похожа на два конца водопроводной трубы, по которой течет вода. Но единственная разница в том, что информация в сокете течет в обоих направлениях. Сокет можно идентифицировать по адресу сокета, который сочетает в себе тип протокола, IP-адрес и номер порта. API сокетов упрощает использование различных протоколов и развитие связи в сети. На следующем рисунке показан общий поток связи с использованием API сокетов. Мы узнаем больше об этих функциях сокетов позже в нашей части кодирования.

Примечание.

На этом рисунке показаны функции сокетов, реализованные на языке C. В этой статье мы будем использовать функции сокетов из Java.

Кодирование

Основные файлы и структура проекта

Примечание.
Сначала установите java JDK для этого проекта, настройте переменные среды и убедитесь, что все работает правильно.

  1. Основная папка проекта будет содержать папки public и resources. В папке public мы будем хранить все наши .html страницы, а в папке resources мы будем хранить наши ресурсы, такие как изображения, видео и т. д.
  2. Наша основная серверная программа WebServer.java будет находиться в корневом каталоге проекта.
  • Если вы программируете вместе с этой статьей, сохраните любое видео в папке ./resources и назовите его cat-test-video.mp4.
  • Структура проекта должна выглядеть примерно так:

Создание сокета и прослушивание новых подключений

Приведенный выше код выполняет следующие действия:

  1. Создает сокет и назначает номер порта для прослушивания (также известный как адрес сокета сервера).
  2. Система сервера прослушивает назначенный порт для любого нового запроса на подключение со стороны клиента.
  3. Если соединение успешно и принято сервером, он возвращает адрес сокета клиента.
  4. Инициализирует класс Connection информацией о клиентском сокете для обработки клиентского HTTP-запроса и отправки обратно HTTP-ответа.

Создание класса Connection

Приведенный выше код выполняет следующие действия:

  1. Получает доступ к входному потоку по ссылке, соединяющей сервер и клиентский сокет. Этот поток используется для чтения HTTP-запроса клиента.
  2. Получает доступ к выходному потоку по ссылке, соединяющей сервер и клиентский сокет. Этот поток используется для отправки HTTP-ответа с сервера.

Обработка HTTP-запроса клиента и отправка HTTP-ответа с сервера

Некоторые вспомогательные методы

Компиляция файла WebServer.java

  • Откройте командную строку в каталоге проекта и скомпилируйте java-файл с помощью команды javac WebServer.java. Будут созданы два файла классов WebServer.class и Connection.class.
  • Затем запустите сервер командой java WebServer
  • Откройте браузер, который будет нашим клиентом, и вы можете открыть inspect окон, а затем network вкладку в браузере, чтобы увидеть сетевую активность
  • Введите localhost:9090 в адресной строке, чтобы отправить запрос на наш сервер. Тогда наша страница index.html будет загружена
  • Теперь нажмите синюю ссылку Serve me some cat videos, чтобы запросить видео на сервере.
  • На вкладке network мы можем заметить, что после перехода по ссылке наш клиент отправляет на сервер два запроса: один для страницы cats.html и один для файла cat-test-video.mp4 video.

Заключение

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

Первоначально опубликовано на https://dev.to 6 декабря 2021 г.