Платформа J2Me
Шрифт:
Класс этого объекта реализует интерфейс, который определяет тип установленного соединения. Тип внедряемого класса абстрактен, поскольку вы ссылаетесь на объект с помощью ссылки на тип интерфейса. Например, объект соединения, выдаваемый в листинге 8.4, реализует интерфейс HttpConnection. Взгляните на следующие строчки кода, расположенные в методе HttpResource.connect .
Connection conn;
HttpConnection httpConn;
.
conn = Connector.open(uri);
httpConn = {HttpConnection) conn;
.
Первый оператор выдает объект соединения. URI указывает схему http. Текущий объект соединения больше чем просто Connection, это HttpConnection. Поэтому вы можете не рискуя
Первый оператор, показанный в следующей выдержке из метода HttpResource.run, выдает полностью определенное имя конкретного класса, который реализует интерфейс HttpConnection:
public void run
System.out.println("Connection class name = " +
conn.getClass. get Name );
connect ;
parse ;
…
}
Если вы запустите эту программу на эмуляторе Sun J2ME Wireless Toolkit, вы увидите, что в следующих выходных данных выводится имя класса, который является частью реализации J2ME Sun, которая используется эмулятором Sun J2ME Wireless Toolkit:
com.sun.midp.io.j2me.http.Protocol
Если вы запустите программу, показанную в листингах 8.1–8.4, на эмуляторе другого производителя, вы увидите другое имя класса. Таким образом опознается реализация данного производителя интерфейса HttpConnection. Все определяемые протоколом классы зависят от реализации.
Модель состояний соединения HTTP. Соединения HTTP могут находиться в одном из трех состояний в течение их жизненного цикла. Эта модель состояний отражает природу запроса-отклика протокола HTTP. Это следующие три состояния:
— Установка — создан объект соединения, но соединения с исходным сервером еще нет.
— Установлено — соединение с сервером было установлено, параметры запроса были посланы на сервер, и объект соединения ожидает отклика с сервера.
— Отключено — соединение было разорвано. Последующие вызовы методов соединения сбрасывают 10Exception.
На рисунке 8.3 показана диаграмма перемещения из состояния в состояние объектов соединения HTTP.
Рис. 8.3.Объекты HttpConnection переходят в три различных состояния во время своего существования
Объект соединения существует в состоянии установки при создании его экземпляра. На данный момент строка запроса не была создана. Чтобы создать запрос, вы должны установить метод HTTP и заголовки запроса. Эти значения устанавливаются с помощью методов, перечисленных в таблице 8.6. Прежде чем соединение сможет войти в состояние «установлено», — прежде, чем оно пошлет запрос серверу и получит ответ, — оно должно установить параметры запроса HTTP, то есть создать сообщение запроса. Вызов этих методов, однако, не приведет к переходу в другое состояние.
Соединение переходит в состояние «установлено», когда вызваны любые из методов, перечисленных в таблице 8.7. Состояние установленного соединения представляет собой период между временем, когда запрос был послан на сервер, и временем, когда либо клиент, либо сервер прервали соединение. Вы можете видеть, что все методы, показанные в таблице 8.7, работают с извлечением данных из ответного сообщения. Чтобы извлечь данные, соединение с сервером должно быть действующим, чтобы клиент получил ответное сообщение.
Таблица 8.6. Методы интерфейса HttpConnection для создания запроса HTTP
Название метода HttpConnection — Описание
void setRequestMethod (String method) — Устанавливает метод запроса HTTP, либо HEAD, либо POST, либо GET
void setRequestProperty (String key, String value) — Включает в запрос указанное поле заголовка со значением, установленным на value
Таблица 8.7. Методы интерфейса HttpConnection, которые позволяют соединению перейти в состояние «установлено»
Название метода HttpConnection — Описание
InputStream openlnputStream — Открывает и выдает ссылку на InputStream (происходит от InputConnection)
OutputStream openOutputStream — Открывает и выдает OutputStream для соединения (происходит из OutputConnection)
DatalnputStream openData!nputStream — Открывает и выдает ссылку на DatalnputStream (происходит из InputConnection)
DataOutputStream openDataOutputStream — Открывает и выдает ссылку на DataOutputStream (происходит изOutputConnection)
long getDate — Получает значение поля заголовка date
String getEncoding — Получает строку, которая описывает шифрование содержимого в ответе (происходит от ContentConnection]
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 — Получает тип содержимого, предоставляемого сервером (происходит из ContentConnection)
Когда соединение находится в состоянии «установлено», вы можете лишь извлекать из него данные либо закрыть его. Вы можете задействовать методы, перечисленные в таблицах 8.7 и 8.9. Методы, показанные в таблице 8.8, извлекают различные части ответа HTTP, за исключением метода close , который разрывает соединение.
Если соединение находится в состоянии «установлено», вы можете больше не активизировать методы, показанные в таблице 8.6. Вы не можете переустановить параметры запроса, что означает, что вы не можете снова использовать объект соединения для доступа к нескольким различным URI. Вы вынуждены создавать экземпляр нового соединения, пересылая новый URI в вызов Connector.ореn. Кстати, либо клиент может прервать соединение после получения отклика, либо удаленный сервер может разорвать соединение послелосылки этого отклика.
Обратите внимание, что в листинге 8.4 порядок, в котором поля заголовков вставляются в сообщения запроса или извлекаются из ответного сообщения сервера, несущественен. Класс соединения имеет дело с абстракциями создания правильно сформированных сообщений HTTP и анализа ответов HTTP.
Таблица 8.8. Методы интерфейса HttpConnection, вызываемые в состоянии «установлено»
Название метода HttpConnection — Описание