| |
доставить пакет данных, хранится не в сокете, а в пакете, то есть в объекте
класса DatagramPacket.
Помимо только что описанных конструкторов, в классе DatagramPacket
определены четыре метода, позволяющие получить данные и информацию об адресе
узла, из которого пришел пакет, или для которого предназначен пакет.
Метод getData возвращает ссылку на массив данных пакета:
public byte[] getData();
Размер пакета, данные из которого хранятся в этом массиве, легко определить
с помощью метода getLength:
public int getLength();
Методы getAddress и getPort позволяют определить адрес и номер порта узла,
откуда пришел пакет, или узла, для которого предназначен пакет:
public InetAddress getAddress();
public int getPort();
Если вы создаете клиент-серверную систему, в которой сервер имеет заранее
известный адрес и номер порта, а клиенты - произвольные адреса и различные
номера портов, то после получения пакета от клиента сервер может определить с
помощью методов getAddress и getPort адрес клиента для установления с ним связи.
Если же адрес сервера неизвестен, клиент может посылать широковещательные
пакеты, указав в объекте класса DatagramPacket адрес сети. Такая методика
обычно используется в локальных сетях.
Как указать адрес сети?
Напомним, что адрес IP состоит из двух частей - адреса сети и адреса узла.
Для разделения компонент 32-разрядного адреса IP используется 32-разрядная
маска, в которой битам адреса сети соответствуют единицы, а битам адреса узла -
нули.
Например, адрес узла может быть указан как 193.24.111.2. Исходя из значения
старшего байта адреса, это сеть класса С, для которой по умолчанию используется
маска 255.255.255.0. Следовательно, адрес сети будет такой: 193.24.111.0.
Подробнее об адресации в сетях TCP/IP вы можете прочитать в 23 томе “Библиотеки
системного программиста”, о котором мы упоминали в разделе “Передача данных с
использованием сокетов” нашей книги.
Приложения DatagramServer и DatagramClient
Приложения DatagramServer и DatagramClient иллюстрируют применение
датаграммных сокетов для передачи данных от нескольких копий одного и того же
клиента одному серверу с известным адресом и номером порта.
Клиентские приложения посылают серверу строки, которые пользователь вводит с
клавиатуры. Сервер принимает эти строки, отображая их в своем консольном окне
вместе с номером порта клиента (рис. 3.4).
Рис. 3.4. Передача данных между приложениями DatagramClient и DatagramServer
через датаграммный сокет
Когда с консоли клиента будет введена строка “quit”, этот клиент и сервер
завершает свою работу. Работа остальных клиентов также может быть завершена
подобным образом, причем независимо от того, работает сервер
|
|