| |
метод read возвращает значение -1. В этом
случае мы прерываем цикл ввода и передачи строк:
if(length == -1)
break;
Если же ответ сервера принят успешно, принятые данные записываются в строку
str, которая отображается на консоли клиента:
System.out.println(">> " + str);
Перед завершением своей работы клиент закрывает входной и выходной потоки, а
также сокет, на котором выполнялась передача данных:
is.close();
os.close();
s.close();
Использование датаграммных сокетов
Как мы уже говорили, датаграммные сокеты не гарантируют доставку пакетов
данных. Тем не менее, они работают быстрее потоковых и обеспечивают возможность
широковещательной расслыки пакетов данных одновременно всем узлам сети.
Последняя возможность используется не очень широко в сети Internet, однако в
корпоративной сети Intranet вы вполне можете ей воспользоваться.
Для работы с датаграммными сокетами приложение должно создать сокет на базе
класса DatagramSocket, а также подготовить объект класса DatagramPacket, в
который будет записан принятый от партнера по сети блок данных.
Канал, а также входные и выходные потоки создавать не нужно. Данные
передаются и принимаются методами send и receive, определенными в классе
DatagramSocket.
Класс DatagramSocket
Рассмотрим конструкторы и методы класса DatagramSocket, предназначенного для
создания и использования датаграммных сокетов.
В классе DatagramSocket определены два конструктора, прототипы которых
представлены ниже:
public DatagramSocket(int port);
public DatagramSocket();
Первый из этих конструкторов позволяет определить порт для сокета, второй
предполагает использование любого свободного порта.
Обычно серверные приложения работают с использованием какого-то заранее
определенного порта, номер которого известен клиентским приложениям. Поэтому
для серверных приложений больше подходит первый из приведенных выше
конструкторов.
Клиентские приложения, напротив, часто применяют любые свободные на
локальном узле порты, поэтому для них годится конструктор без параметров.
Кстати, с помощью метода getLocalPort приложение всегда может узнать номер
порта, закрепленного за данным сокетом:
public int getLocalPort();
Прием и передача данных на датаграммном сокете выполняется с помощью методов
receive и send, соответственно:
public void receive(DatagramPacket p);
public void send(DatagramPacket p);
В качестве параметра этим методам передается ссылка на пакет данных
(соответственно, принимаемый и передаваемый), определенный как объект класса
DatagramPacket. Этот класс будет рассмотрен в следующем разделе нашей книги.
Еще один метод в классе DatagramSocket, которым вы будете пользоваться, это
метод close, предназначенный для закрытия сокета:
public void close();
Напомним, что сборка мусора в Java выполняется только для объектов,
находящихся в оперативной памяти. Такие объекты, как потоки и сокеты, вы должны
закрывать после использования самостоятельно.
Класс DatagramPacket
Перед тем как принимать или передавать данные с использованием методов
receive и send вы должны подготовить объекты класса DatagramPacket. Метод
receive запишет в такой объект принятые данные, а метод send - перешлет данные
из объекта класса DatagramPacket узлу, адрес которого указан в пакете.
Подготовка объекта класса DatagramPacket для приема пакетов выполняется с
помощью следующего конструктора:
public DatagramPacket(byte ibuf[], int ilength);
Этому конструктору передается ссылка на массив ibuf, в который нужно будет
записать данные, и размер этого массива ilength.
Если вам нужно подготовить пакет для передачи, воспользуйтесь конструктором,
который дополнительно позволяет задать адрес IP iaddr и номер порта iport
адресата:
public DatagramPacket(byte ibuf[], int ilength,
InetAddress iaddr, int iport);
Таким образом, информация о том, в какой узел и на какой порт необходимо
|
|