Автор неизвестен - Платформа J2Me
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. Дейтаграммы посылаются и получаются дейтаграммным соединением. Эта программа анализирует полезную нагрузку полученной дейтаграммы и отображает ее на экране
import javax.microedition.midlet.MIDlet;
import javax.microedition.Icdui.Display;
import javax.microedition.Icdui.Command;
import javax.microedition.Icdui.CommandListenerj;
import javax.microedition.Icdui.Displayable;
import javax.microedition.Icdui.TextBox;
import javax.microedition.Icdui.TextFie Id;
import javax.microedition.io.Connector;
import javax.microedition.io.Datagram;
import javax.microedition.io.DatagramConnection;
import Java.io.lOException; ft,
Этот класс реализует дейтаграммкого клиента, который соединяется с сервером синхронизирующего сетевого протокола (NTP) через стандартный порт NTP 123.
Для контроля клиента назначается отдельная нить, поэтому он реализует Runnable. Приложение может осуществлять коммуникации асинхронно из управления его пользовательским интерфейсом.
Обратите внимание, что данный файл представляет только «скелет клиента».
Полная семантика сообщений службы NTP здесь не показана. Цель в том, чтобы просто продемонстрировать структуру клиента с помощью дейтаграмм MIDP.
*/
public class DatagramTest extends MIDlet,
implements CommandListener, Runnable
}
private static final int BUF_SIZE = 1024;
private static Command exit =
new Command ("Exit", Command.EXIT, 1);
private static DatagramTest instance; private Display display;
private TextBox dgramText;
// Дейтаграммное соединение. private DatagramConnection conn;
// Дейтаграмма, которая поддерживает посылку
и получение данных, private Datagram dgram;
// Адрес демона синхронизирующего сетевого протокола (NTP) на
// определенном сервере. NTP использует протокол UDP. private String address = "datagram://srl-usca28-07:123";
/"*
Конструктор No-arg.
*/
public DatagramTest()
{
super (); instance = this;
}
/**
Конструктор.
Обратите внимание, что проверок действительности параметра не осуществляется. Если он деформирован, при попытке соединения будет сброшено исключение.
@param service URI дейтаграммной службы, с которой соединяемся.
*/
public DatagramTest(String service)
(
this ();
address = service;
}
/**
Выдает один экземпляр данного класса. Вызов данного метода до создания объекта возвращает нулевой указатель.
@выдает экземпляр данного класса.
*/
public static DatagramTest getlnstance()
}
return instance;
{
public void startApp()
}
display = Display.getDisplay (this);
dgramText = new TextBox("Datagram contents", null, 2048,
TextField.ANY); dgramText.setCommandListener (this);
display.setCurrent(dgramText); run ();
}
/*
Запускает дейтаграммного клиента.
Открывает соединение со службой дейтаграммы.
Заполняет объект дейтаграммы и посылает его. Получает ответ асинхронно и записывает байты в стандартный результат для демонстрации. Бесшумно перехватывает исключения, связанные с любым соединением.
*/
public void run ()
}
try int maxLength;
// Откройте клиентское соединение,
conn = (DatagramConnection) Connector.open(address);
maxLength = conn.getMaximumLength();
dgram = conn.newDatagram(maxLength);
// Убедитесь, что указатель для чтения/записи находится в
// начале буфера, так что данные будут переписывать
// буферную память, dgram.reset();
// Заполните дейтаграмму перед посылкой сообщением,
// которое служба дейтаграммы поймет.
// Создайте запрос в дейтаграмме.
**/
// Пошлите только что заполненную дейтаграмму. conn.send(dgram);
// Получите дейтаграмму; ее содержимое помещается в
// указанный объект дейтаграммы. conn.receive(dgram);
// Используйте данный байтовый массив для пересылки содержимого
// ответа сервера более управляемому объекту Java,
// как, например, String. Вы можете затем использовать
// дейтаграмму для другого события пересылки или получения.
byte [] data = dgram.getData ();
// Извлеките строку ответа. String str = new String (data);
// Проделайте обработку ответа. Здесь он
// просто распечатывается для демонстрации. System.out.println(str);
// Переустановите указатель для чтения/записи для объекта
// дейтаграммы. В следующий раз, когда данные будут записываться
// в буфер дейтаграммы, он перепишет данные последней операции
// по пересылке или получению.
//Это гарантирует, что предыдущие и последующие данные не
// перемешаются в одном буфере и что не будет создано
// испорченных засоренных сообщений.
dgram.reset();
// Продолжайте обработку, возможно, посылая и получая другие
// сообщения сервера.
//….
}
catch (lOException ioe)
(
System.out.println(ioe.getMessage());
loe.printStackTrace();
quit();
}
return;
}
public void pauseApp()
{
}
void quit()
destroyApp(true); notifyDestroyed(); }