Читайте также:
|
|
Необходимые средства поддержки протокола UDP находятся в пакете java.net. Для создания дейтаграмм в Java существует класс DatagramPacket. При получении дейтаграммы по протоколу UDP класс DatagramPacket используется также для чтения данных, адреса отправителя и метаинформации.
Чтобы создать дейтаграмму для отправки на удаленную машину, используется следующий конструктор:
public DatagramPacket(byte[] ibuf, int length, InetAddress iaddr,
int iport);
Здесь ibuf — массив байт, содержащий кодированное сообщение; length — количество байт, которое должно быть помещено в пакет, что определяет размер дейтаграммы; iaddr — это экземпляр класса InetAddress, который хранит IP-адрес получателя; iport указывает номер порта, на который посылается дейтаграмма.
Чтобы получить дейтаграмму, необходимо использовать другой конструктор для объекта DatagramPacket, в котором будут находиться принятые данные. Прототип конструктора имеет вид:
public DatagramPacket(byte[] ibuf, int length);
Здесь ibuf — массив байт, куда должны быть скопированы данные из дейтаграммы, а length — количество байт, которое должно быть скопировано.
Дейтаграммы не ограничены определенной длиной; можно создавать как очень длинные, так и очень короткие дейтаграммы. Заметим, однако, что между клиентом и сервером должно существовать соглашение о длине дейтаграмм, поскольку оба они должны создать массив байт нужного размера перед созданием объекта DatagramPacket для посылки или получения дейтаграммы.
Когда дейтаграмма получена, как будет продемонстрировано ниже, можно прочитать ее данные. Другие методы позволяют получить метаинформацию, относящуюся к сообщению:
public int getLength();
public byte[] getData();
public InetAddress getAddress();
public int getPort();
Метод getLength() возвращает количество байт, из которых состоят данные дейтаграммы. Метод getData() позволяет получить массив, содержащий эти данные. getAddress() возвращает адрес отправителя, а getPort() — номер порта UDP, используемый отправителем.
Отправка и получение дейтаграмм осуществляется при помощи класса DatagramSocket, который создает сокет UDP. У него есть два конструктора, один из которых позволяет системе назначить любой из свободных портов UDP. Другой дает возможность задать конкретный порт, что полезно при разработке сервера. Как и для портов ТСР, в большинстве операционных систем порты с номерами меньше 1024 доступны только процессам с привилегиями суперпользователя.
public DatagramSocket() throws SocketException;
public DatagramSocket(int port) throws SocketException;
Сокет, созданный первым конструктором, можно использовать для отправки правильно адресованных дейтаграмм при помощи следующего метода класса DatagramSocket:
public void send(DatagramPacket p) throws IOException;
Если DatagramSocket создан вторым конструктором, можно получить дейтаграмму:
public syncronized void receive(DatagramPacket p) throws IOException;
Заметим, что метод receive() блокируется до момента получения дейтаграммы. Поскольку UDP является ненадежным протоколом, нельзя быть уверенным, что возврат из receive() вообще произойдет. Эта проблема многократно обсуждалась. В примере, приведенном в разделе "Создание клиента UDP", будет продемонстрировано одно из возможных решений, в котором применяется дополнительный поток выполнения. Такой метод может существено облегчить программирование с использованием UDP.
Когда закончен обмен через сокет UDP, его следует закрыть методом
public syncronized void close();
Дата добавления: 2015-09-11; просмотров: 79 | Поможем написать вашу работу | Нарушение авторских прав |
<== предыдущая лекция | | | следующая лекция ==> |
Реализация протоколов транспортного уровня в языке JAVA | | | Широковещательные пакеты |