Страница 49 из 86
Класс HttpResource определяет API, который поддерживает получение ресурсов в отдельной нити. Он реализует Ru
Объекты соединений. Как вы знаете, различные интерфейсы в структуре общих соединений представляют различные типы соединений. Однако это конкретные реализации данных интерфейсов, которые на самом деле предоставляют соединению его свойства и возможности. Сейчас самое подходящее время более внимательно взглянуть на реализации, стоящие за этими интерфейсами.
Я ссылался на класс Co
Класс этого объекта реализует интерфейс, который определяет тип установленного соединения. Тип внедряемого класса абстрактен, поскольку вы ссылаетесь на объект с помощью ссылки на тип интерфейса. Например, объект соединения, выдаваемый в листинге 8.4, реализует интерфейс HttpCo
Co
HttpCo
.
co
httpCo
.
Первый оператор выдает объект соединения. URI указывает схему http. Текущий объект соединения больше чем просто Co
Первый оператор, показанный в следующей выдержке из метода HttpResource.run(), выдает полностью определенное имя конкретного класса, который реализует интерфейс HttpCo
public void run ()
System.out.println("Co
co
co
parse ();
…
}
Если вы запустите эту программу на эмуляторе Sun J2ME Wireless Toolkit, вы увидите, что в следующих выходных данных выводится имя класса, который является частью реализации J2ME Sun, которая используется эмулятором Sun J2ME Wireless Toolkit:
com.sun.midp.io.j2me.http.Protocol
Если вы запустите программу, показанную в листингах 8.1–8.4, на эмуляторе другого производителя, вы увидите другое имя класса. Таким образом опознается реализация данного производителя интерфейса HttpCo
Модель состояний соединения HTTP. Соединения HTTP могут находиться в одном из трех состояний в течение их жизненного цикла. Эта модель состояний отражает природу запроса-отклика протокола HTTP. Это следующие три состояния:
— Установка — создан объект соединения, но соединения с исходным сервером еще нет.
— Установлено — соединение с сервером было установлено, параметры запроса были посланы на сервер, и объект соединения ожидает отклика с сервера.
— Отключено — соединение было разорвано. Последующие вызовы методов соединения сбрасывают 10Exception.
На рисунке 8.3 показана диаграмма перемещения из состояния в состояние объектов соединения HTTP.
Рис. 8.3. Объекты HttpCo
Объект соединения существует в состоянии установки при создании его экземпляра. На данный момент строка запроса не была создана. Чтобы создать запрос, вы должны установить метод HTTP и заголовки запроса. Эти значения устанавливаются с помощью методов, перечисленных в таблице 8.6. Прежде чем соединение сможет войти в состояние «установлено», — прежде, чем оно пошлет запрос серверу и получит ответ, — оно должно установить параметры запроса HTTP, то есть создать сообщение запроса. Вызов этих методов, однако, не приведет к переходу в другое состояние.
Соединение переходит в состояние «установлено», когда вызваны любые из методов, перечисленных в таблице 8.7. Состояние установленного соединения представляет собой период между временем, когда запрос был послан на сервер, и временем, когда либо клиент, либо сервер прервали соединение. Вы можете видеть, что все методы, показанные в таблице 8.7, работают с извлечением данных из ответного сообщения. Чтобы извлечь данные, соединение с сервером должно быть действующим, чтобы клиент получил ответное сообщение.
Таблица 8.6. Методы интерфейса HttpCo
Название метода HttpCo
void setRequestMethod (String method) — Устанавливает метод запроса HTTP, либо HEAD, либо POST, либо GET
void setRequestProperty (String key, String value) — Включает в запрос указанное поле заголовка со значением, установленным на value
Таблица 8.7. Методы интерфейса HttpCo
Название метода HttpCo
InputStream openlnputStream() — Открывает и выдает ссылку на InputStream (происходит от InputCo
OutputStream openOutputStream() — Открывает и выдает OutputStream для соединения (происходит из OutputCo
DatalnputStream openData!nputStream() — Открывает и выдает ссылку на DatalnputStream (происходит из InputCo
DataOutputStream openDataOutputStream() — Открывает и выдает ссылку на DataOutputStream (происходит изOutputCo
long getDate() — Получает значение поля заголовка date
String getEncoding() — Получает строку, которая описывает шифрование содержимого в ответе (происходит от ContentCo
long getExpiration() — Получает значение поля заголовка expires
String getHeaderField (String name) — Получает значение указанного поля заголовка
long getHeaderFieldDate (String name, long def) — Получает значение указанного поля заголовка. Значение анализируется как число
String getHeaderFieldlnt (String name, int def) — Получает значение указанного поля заголовка. Значение анализируется как число
String getHeaderFieldKey (int n) — Получает указанное поле заголовка. Аргумент представляет собой индекс поля заголовка
long getLastModified() — Получает значение поля заголовка last-modified
long getLength() — Извлекает длину поля заголовка.
int getResponseCode() — Получает код состояния отклика HTTP
String getResponseMessage() — Получает ответное сообщение HTTP
String getType() — Получает тип содержимого, предоставляемого сервером (происходит из ContentCo