МегаПредмет

ПОЗНАВАТЕЛЬНОЕ

Сила воли ведет к действию, а позитивные действия формируют позитивное отношение


Как определить диапазон голоса - ваш вокал


Игровые автоматы с быстрым выводом


Как цель узнает о ваших желаниях прежде, чем вы начнете действовать. Как компании прогнозируют привычки и манипулируют ими


Целительная привычка


Как самому избавиться от обидчивости


Противоречивые взгляды на качества, присущие мужчинам


Тренинг уверенности в себе


Вкуснейший "Салат из свеклы с чесноком"


Натюрморт и его изобразительные возможности


Применение, как принимать мумие? Мумие для волос, лица, при переломах, при кровотечении и т.д.


Как научиться брать на себя ответственность


Зачем нужны границы в отношениях с детьми?


Световозвращающие элементы на детской одежде


Как победить свой возраст? Восемь уникальных способов, которые помогут достичь долголетия


Как слышать голос Бога


Классификация ожирения по ИМТ (ВОЗ)


Глава 3. Завет мужчины с женщиной


Оси и плоскости тела человека


Оси и плоскости тела человека - Тело человека состоит из определенных топографических частей и участков, в которых расположены органы, мышцы, сосуды, нервы и т.д.


Отёска стен и прирубка косяков Отёска стен и прирубка косяков - Когда на доме не достаёт окон и дверей, красивое высокое крыльцо ещё только в воображении, приходится подниматься с улицы в дом по трапу.


Дифференциальные уравнения второго порядка (модель рынка с прогнозируемыми ценами) Дифференциальные уравнения второго порядка (модель рынка с прогнозируемыми ценами) - В простых моделях рынка спрос и предложение обычно полагают зависящими только от текущей цены на товар.

Характеристика сокетов UDP





UDP существенно отличается от ТСР. UDP является ненадежным, основанным на сообщениях протоколом без установления логического соединения. Наиболее подходящая для UDP аналогия — связь посредством почтовых открыток.

В протоколе UDP диалог должен быть разделен на небольшие сообщения, которые умещаются в небольшой пакет определенного размера. Когда посылается сообщение, нельзя быть уверенным, что ответ будет получен: сообщение могло быть потеряно по пути, мог потеряться ответ получателя, получатель также мог игнорировать сообщение.

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

Как и для протокола ТСР, программирование для UDP будет использовать абстракцию сокета, но сокеты UDP сильно отличаются от сокетов ТСР. Если продолжить почтовую аналогию, то сокет UDP соответствует почтовому ящику.

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

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

Итак, программирование с использованием UDP требует решить следующие задачи:

  • Создание правильно адресованной дейтаграммы
  • Создание сокета для рассылки и получения дейтаграмм данным приложением
  • Помещение дейтаграмм в сокет для передачи по назначению
  • Ожидание получения дейтаграмм из сокета
  • Декодирование дейтаграмм для выделения самого сообщения, адреса отправителя и другой метаинформации

 

Классы UDP

Необходимые средства поддержки протокола 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, его следует закрыть методом

 

public syncronized void close();





©2015 www.megapredmet.ru Все права принадлежат авторам размещенных материалов.