| |
ата, не гарантируется, что они будут получены в той же самой
последовательности, в которой были переданы. Потоковые сокеты, напротив,
гарантируют доставку пакетов данных, причем в правильной последовательности.
Причина отстутствия гарантии доставки данных при использовании датаграммных
сокетов заключается в использовании такими сокетами протокола UDP, который, в
свою очередь, основан на протоколе с негарантированной доставкой IP. Потоковые
сокеты работают через протокол гарантированной доставки TCP.
В 23 томе “Библиотеки системного программиста”, который называется
“Глобальные сети компьютеров. Практическое введение в Internet, E-Mail, FTP,
WWW и HTML, программирование для Windows Sockets” мы уже рассказывали про
сокеты в среде операционной системы Microsoft Windows. В этой книге вы найдете
примеры приложений, составленных на языке программирования С и работающих как с
потоковыми, так и с датаграммными сокетами.
Работа с потоковыми сокетами
Как мы уже говорили, интерфейс сокетов позволяет передавать данные между
двумя приложениями, работающими на одном или разных узлах сети. В процессе
создания канала передачи данных одно из этих приложений выполняет роль сервера,
а другое - роль клиента. После того как канал будет создан, приложения
становятся равноправными - они могут передавать друг другу данные симметричным
образом.
Рассмотрим этот процесс в деталях.
Инициализация сервера
Вначале мы рассмотрим действия приложения, которое на момент инициализации
является сервером.
Первое, что должно сделать серверное приложение, это создать объект класса
ServerSocket, указав конструктору этого класса номер используемого порта:
ServerSocket ss;
ss = new ServerSocket(9999);
Заметим, что объект класса ServerSocket вовсе не является сокетом. Он
предназначен всего лишь для установки канала связи с клиентским приложением,
после чего создается сокет класса Socket, пригодный для передачи данных.
Установка канала связи с клиентским приложением выполняется при помощи
метода accept, определенного в классе ServerSocket:
Socket s;
s = ss.accept();
Метод accept приостанавливает работу вызвавшей его задачи до тех пор, пока
клиентское приложение не установит канал связи с сервером. Если ваше приложение
однозадачное, его работа будет блокирована до момента установки канала связи.
Избежать полной блокировки приложения можно, если выполнять создание канала
передачи данных в отдельной задаче.
Как только канал будет создан, вы можете использовать сокет сервера для
образования входного и выходного потока класса InputStream и OutputStream,
соответственно:
InputStream is;
OutputStream os;
is = s.getInputStream();
os = s.getOutputStream();
Эти потоки можно использовать таким же образом, что и потоки, связанные с
файлами.
Обратите также внимание на то, что при создании серверного сокета мы не
указали адрес IP и тип сокета, ограничившись только н
|
|