Дейтаграмма может содержать любую информацию. Дейтаграммная служба определяет формат и содержимое ее дейтаграмм. Посылающее и получающее устройства должны создавать дейтаграммы таким образом, чтобы они придерживались этих определений. То есть 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. Оно также должно быть способно анализировать ответ, возвращенный сервером.
Читать дальше