logo
Хабибуллин

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

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

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

1.Сервер создает сокет, прослушивающий порт сервера.

2.Клиент тоже создает сокет, через который связывается с сервером, сервер начинает устанавливать (accept) связь с клиентом.

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

4.Клиент посылает запрос на сервер через порт с новым номером.

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

В Java сокет — это объект класса Socket из пакета java.net. В классе семь конструкторов, в которые разными способами заносится адрес хоста и номер порта. Чаще всего применяется конструктор

Socket(String host, int port);

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

getInputStream() — возвращает входной поток типа InputStream;

getOutputStream() — возвращает выходной поток типа OutputStream.

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

1.Клиент посылает серверу запрос на получение файла строкой "POST filename HTTP/1.1\n\n", где filename — строка с путем к файлу на сервере.

2.Сервер анализирует строку, отыскивает файл с именем filename и возвращает его клиенту. Если имя файла filename заканчивается наклонной чертой /, то сервер понимает его как имя каталога и возвращает файл index.html, находящийся в этом каталоге.

3.Перед содержимым файла сервер посылает строку вида "HTTP/1.1 code \n\n", где code — это код ответа, одно из чисел: 200 — запрос удовлетворен, файл посылается; 400 — запрос не понят; 404 — файл не найден.

4.Сервер закрывает сокет и продолжает слушать порт, ожидая следующего запроса.