Чтение онлайн

на главную

Жанры

Шрифт:

datagram:/7:513

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

datagram://server.foo.com:513

Когда соединение установлено, ваше приложение может использовать его для отправки и получения дейтаграмм. Интерфейс javax.microedition.io.Datagram определяет дейтаграммы, которые являются частями сообщения, посланными и полученными протоколами передачи дейтаграмм. Объект DatagramConnection посылает и получает объекты Datagram. Обратите внимание, что методы, указанные в таблице 8.9, содержат несколько ссылок на тип Datagram.

В таблице 8.10 перечислены методы интерфейса Datagram. Обратите внимание, что они отражают только следующие понятия:

— адрес — представляет адрес посылающего или принимающего объекта;

— полезная нагрузка — дейтаграмма рассматривает данные как один непрозрачный объект без интерпретации его формы, структуры или типа.

Это минимальная информация, требуемая всеми пакетами. Все дейтаграммы должны устанавливать эту информацию для того, чтобы пересылка прошла успешно.

В интерфейсе Datagram отсутствует информация о синтаксисе или семантике полезной нагрузки. Причина этого заключается всего лишь в том, что дейтаграммы не определяют синтаксиса или семантики данных, которые они переносят. Дейтаграммы просто рассматривают свою полезную нагрузку как последовательность байтов. Полезная нагрузка дейтаграммы определяется просто как byte [].

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

Интерфейс Datagram происходит из интерфейсов Datalnput и DataOutput в пакете java.io. Такое происхождение гарантирует наличие удобного интерфейса для чтения двоичных данных из дейтаграммы и записи в нее. На рисунке 8.4 показана иерархия происхождения интерфейса Datagram. В таблице 8.11 перечислены методы интерфейса Datalnput, а в таблице 8.12 перечислены методы интерфейса DataOutput. Эти интерфейсы идентичны интерфейсам пакета java.io J2SE.

Рисунок 8.4. Дейтаграмма определяет общие данные. Методы в этой иерархии интерфейсов поддерживают только низшую абстракцию, которая дает возможность манипулировать встроенными типами данных. Для полей, определяемых протоколом, абстракции не существует

Таблица 8.10. Методы интерфейса Datagram

Название метода интерфейса Datagram — Описание

String getAddress — Выдает адрес в данной дейтаграмме

byte [] getData — Выдает буфер, содержащий полезную нагрузку дейтаграмм

int getLength — Выдает длину полезной нагрузки дейтаграммы

int getOffset — Выдает смещение указателя для чтения/записи в буфере полезной нагрузки

void reset — Восстанавливает позицию указателя для чтения/записи в буфере полезной нагрузки

void setAddress (Datagram reference) — Устанавливает, что адрес данной дейтаграммы является адресом указанной дейтаграммы

void setAddress (String addr) — Устанавливает адрес, указываемый строкой

void setData (byte[] buffer, int offset, int len) — Устанавливает полезную нагрузку данной дейтаграммы

void setLength (int len) — Устанавливает длину полезной нагрузки дейтаграммы

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

Таблица 8.11. Методы интерфейса Datalnput

Название метода Datalnput — Описание

boolean readBoolean — Считывает только значение Boolean из входного потока

byte readByte — Считывает один байт из входного потока

char readChar — Считывает символ из входного потока

void readFully (byte [] b) — Считывает байты из входного потока, пока указанный массив не наполнится

void readFully(byte[] b, int off, int len) — Считывает указанное число байт в указанный буфер, начиная с указанного сдвига

int readlnt — Считывает значение int из входного потока

long readLong — Считывает значение long из входного потока

short readShort — Считывает два входных байта и выдает значение short

int readUnsignedByte — Считывает один байт, дополненный нулями, из потока

int readUnsignedShort — Считывает два входных байта и выдает значение int

String readUTF — Считывает в UTF-8 шифрованную строку символов

int skipBytes (int n) — Просматривает n байтов из входного потока

Таблица 8.12. Методы интерфейса DataOutput

Название метода DataOutput — Описание

void writeByte (byte [] b) — Записывает все байты в выходной поток

void write (byte[] b, int off, int len) — Записывает указанное число байтов в выходной поток, начиная от смещения

void write (int b) — Записывает младший байт в выходной поток

void writeBoolean (boolean v) — Записывает значение boolean

void writeByte (int v) — Записывает младший байт int

void writeChar (int c) — Записывает два младших байта в выходной поток

void writeChars (String s) — Записывает каждый символ в уникоде в выходной поток

void writelnt(int v) — Записывает int (четыре байта) в выходной поток

void writeLong (long v) — Записывает значение long (четыре байта) в выходной поток

void writeShort (int v) — Записывает int как два байта в выходной поток

void writeUTF(String s) — Записывает каждый символ в формате Java LJTF, которому предшествуют два байта, показывающие длину в байтах

Например, если приложение MIDP хочет взаимодействовать со стандартным демоном синхронизирующего сетевого протокола Unix (Unix Network Time Protocol (NTP)), оно должно создать соединение, которое использует стандартный номер порта демона NTP, то есть 123. Приложение-клиент MIDP должно задать формат полезной нагрузки ответных дейтаграмм, придерживаясь определения NTP. Оно также должно быть способно анализировать ответ, возвращенный сервером.

MIDP кое в чем отличается от платформы J2SE в своей поддержке дейтаграммных соединений. J2SE имеет пакет java.net. Например, ее класс, DatagramPacket определяет дейтаграмму. Класс DatagramSocket реализует протокол передачи дейтаграмм с помощью соединений сокета.

Эти классы не существуют в CLDC/MIDP. В действительности пакет java.net недоступен в CLDC/MIDP. С другой стороны, CDC содержит пакет java.net, который содержит эти классы.

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

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

Программа, описанная в листинге 8.5, на самом деле не осуществляет этап 3. Его выполнение требует создания должным образом отформатированного сообщения, как ожидается службой, с которой соединяется клиент. Также «обработка», указанная в шаге 5, включает лишь вывод ответа сервера в стандартный результат. В настоящих приложениях клиент использовал бы дейтаграммную информацию для локальной обработки.

Листинг 8.5. Дейтаграммы посылаются и получаются дейтаграммным соединением. Эта программа анализирует полезную нагрузку полученной дейтаграммы и отображает ее на экране

Популярные книги

Бремя империи

Афанасьев Александр
Бремя империи - 1.
Фантастика:
альтернативная история
9.34
рейтинг книги
Бремя империи

Я подарю тебе ребёнка

Малиновская Маша
Любовные романы:
современные любовные романы
6.25
рейтинг книги
Я подарю тебе ребёнка

Идеальный мир для Лекаря 9

Сапфир Олег
9. Лекарь
Фантастика:
боевая фантастика
юмористическое фэнтези
6.00
рейтинг книги
Идеальный мир для Лекаря 9

Старатель 3

Лей Влад
3. Старатели
Фантастика:
боевая фантастика
космическая фантастика
5.00
рейтинг книги
Старатель 3

Цеховик. Книга 1. Отрицание

Ромов Дмитрий
1. Цеховик
Фантастика:
попаданцы
альтернативная история
5.75
рейтинг книги
Цеховик. Книга 1. Отрицание

Кодекс Охотника. Книга XVI

Винокуров Юрий
16. Кодекс Охотника
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Кодекс Охотника. Книга XVI

Великий перелом

Ланцов Михаил Алексеевич
2. Фрунзе
Фантастика:
попаданцы
альтернативная история
5.00
рейтинг книги
Великий перелом

Аномальный наследник. Пенталогия

Тарс Элиан
Аномальный наследник
Фантастика:
фэнтези
6.70
рейтинг книги
Аномальный наследник. Пенталогия

Защитник

Кораблев Родион
11. Другая сторона
Фантастика:
боевая фантастика
попаданцы
рпг
5.00
рейтинг книги
Защитник

Третье правило дворянина

Герда Александр
3. Истинный дворянин
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Третье правило дворянина

Титан империи

Артемов Александр Александрович
1. Титан Империи
Фантастика:
фэнтези
попаданцы
аниме
5.00
рейтинг книги
Титан империи

Архонт

Прокофьев Роман Юрьевич
5. Стеллар
Фантастика:
боевая фантастика
рпг
7.80
рейтинг книги
Архонт

Кровь, золото и помидоры

Распопов Дмитрий Викторович
4. Венецианский купец
Фантастика:
альтернативная история
5.40
рейтинг книги
Кровь, золото и помидоры

Штурм Земли

Семенов Павел
8. Пробуждение Системы
Фантастика:
боевая фантастика
постапокалипсис
рпг
5.00
рейтинг книги
Штурм Земли