Иллюстрированный самоучитель по Java

Работа по протоколу TCP

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

Чтобы сгладить различия в реализациях разных серверов, между сервером и портом введен промежуточный программный слой, названный сокетом (socket). Английское слово socket переводится как электрический разъем, розетка. Так же как к розетке при помощи вилки можно подключить любой электрический прибор, лишь бы он был рассчитан на 220 В и 50 Гц, к соке-ту можно присоединить любой клиент, лишь бы он работал по тому же протоколу, что и сервер. Каждый сокет связан (bind) с одним портом, говорят, что сокет прослушивает (listen) порт. Соединение с помощью сокетов устанавливается так.

  1. Сервер создает сокет, прослушивающий порт сервера.
  2. Клиент тоже создает сокет, через который связывается с сервером, сервер начинает устанавливать (accept) связь с клиентом.
  3. Устанавливая связь, сервер создает новый сокет, прослушивающий порт с другим, новым номером, и сообщает этот номер клиенту.
  4. Клиент посылает запрос на сервер через порт с новым номером.

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

В Java сокет – это объект класса socket из пакета java.io. В классе шесть конструкторов, в которые разными способами заносится адрес хоста и номер порта. Чаще всего применяется конструктор:

Socket(String host, int port)

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

  • getlnputStream() – возвращает входной поток типа InputStream;
  • getOutputStream() – возвращает выходной поток типа OutputStream.

Приведем пример получения файла с сервера по максимально упрощенному протоколу HTTP.

  1. Клиент посылает серверу запрос на получение файла строкой "POST filename HTTP/1.l\n\n", где filename – строка с путем к файлу на сервере.
  2. Сервер анализирует строку, отыскивает файл с именем filename и возвращает его клиенту. Если имя файла filename заканчивается наклонной чертой /, то сервер понимает его как имя каталога и возвращает файл in-dex.html, находящийся в этом каталоге.
  3. Перед содержимым файла сервер посылает строку вида "HTTP/1.1 code OK\n\n", где code – это код ответа, одно из чисел: 200 – запрос удовлетворен, файл посылается; 400 – запрос не понят; 404 – файл не найден.
  4. Сервер закрывает сокет и продолжает слушать порт, ожидая следующего запроса.
  5. Клиент выводит содержимое полученного файла в стандартный вывод System, out или выводит код сообщения сервера в стандартный вывод сообщений System, err.
  6. Клиент закрывает сокет, завершая связь.

Этот протокол реализуется в клиентской программе листинга 19.3 и серверной программе листинга 19.4.

Если Вы заметили ошибку, выделите, пожалуйста, необходимый текст и нажмите CTRL + Enter, чтобы сообщить об этом редактору.