Добавить в цитаты Настройки чтения

Страница 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