Технологии Java

Работа с сетью

Загрузка страницы

  • Что происходит, когда браузер показывает страницу?
    • Определение IP‑адреса (DNS)
    • Загрузка страницы (HTTP[S])
    • Отображение страницы (HTML)

Как работает DNS (1)

  • У кого узнаем IP‑адрес www.kgeorgiy.info?
    • У локального DNS‑сервера
  • Откуда локальный сервер знает IP‑адрес www.kgeorgiy.info?
    • Спрашивает у вышестоящего DNS‑сервера
    • Кеширует ответ
  • Откуда вышестоящий сервер знает IP‑адрес www.kgeorgiy.info?
    • Спросить у ответственного (авторитетного) DNS‑сервера

Как работает DNS (2)

  • Как узнать IP‑адрес www.kgeorgiy.info?
    • Взять адрес корневого DNS‑сервера из списка
    • Спросить у корневого DNS‑сервера, кто отвечает за info.?
    • Спросить у ответственного за info., кто отвечает за kgeorgiy.info.?
    • Спросить у ответственного за kgeorgiy.info. адрес www.kgeorgiy.info.?

Как работает HTTP[S]

  • Устанавливает TCP-соединение
    • По IP-адресу и номеру порта
    • Двусторонний поток байт
  • Отсылает запрос
    • Заголовки
    • Тело запроса
  • Принимает ответ
    • Заголовки
    • Тело ответа

Как работает TCP

  • Посылает и принимает IP-пакеты
    • Установка соединения
    • Передача данных
    • Переупорядочивание и фрагментация пакетов
    • Закрытие и разрывы соединений
  • Базируется на IP
    • Отдельные пакеты без гарантии доставки

Как работает IP

  • Как доставить пакет по IP-адресу?
    • Прямого соединения нет
    • Адресов много
    • Отправить шлюзу (по умолчанию)
    • Рекурсивно
  • Настоящие шлюзы
    • Таблица маршрутизации
      • По префиксам
    • Отправит шлюзу из таблицы
  • Базируется на канальном уровне
    • Отдельные фреймы по MAC-адресам
    • Ethernet, Wi-Fi, Bluetooth, …

Как работает канальный уровень

  • Как узнать MAC-адрес по IP-адресу?
    • Address Resolution Protocol
  • Как доставить фрейм по MAC-адресу?
    • Передать всем (хаб)
    • Передать в нужный порт (свитч)
  • Базируется на физическом уровне
    • Электромагнитные сигналы

Стек протоколов

Содержание

Стек протоколов

Internet Protocol (IP)

  • IP‑адрес
    • IPv4
      • 32 бита, 4 октета
      • 193.31.30.254
    • IPv6
      • 128 бит, 8 групп
      • 2a0b:7080:20
        ::1:9ae1
  • Порт (16 бит)

Transmission Control Protocol

  • Двусторонний канал с гарантией доставки

User Datagram Protocol

  • Односторонний канал без гарантии доставки

Адреса

Содержание

Интернет‑адрес

  • Представляет пару IP‑адрес – доменное имя

Получение интернет‑адресов

Методы интернет‑адресов

Адрес порта

  • Представляет пару интернет‑адрес – порт

Класс InetSocketAddress

Работа с TCP

Содержание

TCP‑сокеты

  • Применяются для связи по протоколу TCP
    • Образуют два независимых потока данных
  • Классы
    • Socket – представляет TCP‑соединение, создает TCP‑соединение на стороне пользователя
    • ServerSocket – создает TCP‑соединения на стороне сервера

Создание соединения на клиенте

Ввод‑вывод

Получение информации

Закрытие соединения

Создание соединений на сервере

Прием соединений на сервере

  • Методы класса ServerSocket
    • Socket accept() – ждёт следующего клиента и создает соединение
    • setSoTimeout(timeout) – установка времени ожидания
    • getSoTimeout() – получение времени ожидания
    • close() – окончание ожидания клиентов

Работа с UDP

Содержание

UDP‑сокеты

  • Применяются для связи по протоколу UDP
  • Классы

Создание UDP‑пакетов

Операции с UDP‑пакетами

Создание UDP‑сокета

Прием и отсылка UDP‑пакетов

  • Прием пакета
    • receive(datagramPacket) – ожидает получения пакета
    • Блокируется до приема пакета
    • Возможно принимать пакеты параллельно
  • Отсылка пакета
    • send(datagramPacket) – отсылает пакет
    • Возможно отсылать пакеты параллельно

URI и URL

Содержание

Uniform Resource Identifier

  • Идентифицирует ресурс
  • Общий URI
    • [scheme:]scheme‑specific‑part[#fragment]
  • Иерархический URI
    • [scheme:][//[user‑info@]host[:port]][path][?query] [#fragment]
  • Класс URI

Создание URI

Получение частей URI

getScheme() scheme
getSchemeSpecificPart() scheme‑specific part
getAuthority() [user‑info@]host[:port]
getUserInfo() user‑info
getHost() host
getPort() port
getPath() path
getQuery() query
getFragment() fragment

Операции над URI

Uniform Resource Locator

  • Указывает местоположение ресурса
  • Подмножество иерархических URI
  • Класс URL

Создание URL

Соединения

Содержание

Соединения

  • Позволяют оперировать с ресурсами, заданными URL

Жизненный цикл соединения

Поддерживаемые протоколы

  • http – HTTP‑ресурс
  • https – HTTPS‑ресурс
  • ftp – FTP‑файл
  • file – локальный файл
  • jar – файл внутри Jar

Работа с HTTP

Содержание

HTTP client

Создание клиента

  • Класс HttpClient.Builder
    • HttpClient client = HttpClient.newBuilder()
          .version(HttpClient.Version.HTTP_2)
          .proxy(ProxySelector.of(
              new InetSocketAddress("proxy.itmo.ru", 3128)))
          .followRedirects(
              HttpClient.Redirect.NORMAL)
          .cookieHandler(new CookieManager())
          .authenticator(new Authenticator(){...})
          .build();
      

Создание запроса

  • Класс HttpRequest.Builder
    • HttpRequest request = HttpRequest.newBuilder()
          .uri(new URI("https://www.kgeorgiy.info/hello"))
          .version(HttpClient.Version.HTTP_2)
          .header("Cache‑Control", "no‑cache")
          .header("User‑Agent", "hello")
          .timeout(Duration.ofSeconds(3))
          .POST(HttpRequest.BodyPublishers
              .ofString("world", StandardCharsets.UTF_8))
          .build();
      

Исполнение запроса

Результат

  • Класс HttpResponse<T>
  • Пример
    • HttpResponse<String> response = client.send(request,
          HttpResponse.BodyHandlers.ofString(
              StandardCharsets.UTF_8));
      if (response.statusCode() ==
              HttpURLConnection.HTTP_OK
      ) {
          System.out.println(response.body());
      } else { // Fail }
      

HTTP server

  • Модуль jdk.httpserver
  • Пакет com.sun.net.httpserver
  • Основные классы

Обработчик запросов

Пример обработчика

  • HttpHandler helloHandler = t -> {
        String name;
        try (IS is = t.getRequestBody()) {
            name = new BR(new ISR(is, SC.UTF_8)).readLine();
        }
        byte[] response = ("Hello, " + name)
            .getBytes(SC.UTF_8);
        t.sendResponseHeaders(
            HttpURLConnection.HTTP_OK, response.length);
        try (OutputStream os = t.getResponseBody()) {
            os.write(response);
        }
    };
    

Сервер

  • Класс HttpServer
  • Пример
    • HttpServer server = HttpServer.create(
          new InetSocketAddress(8080), // порт
          0 // размер очереди
      );
      server.createContext("/hello", helloHandler);
      server.setExecutor(null); // по умолчанию
      server.start();
      

Заключение

Содержание

За кадром

Ссылки

Вопросы

???