Автор неизвестен - Платформа J2Me
— Отключено — соединение было разорвано. Последующие вызовы методов соединения сбрасывают 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 — Описание
void close() — Прерывает соединение (происходит из интерфейса Connection)
String getFile() — Получает поле <file> URL данного соединения
String getHost() — Получает поле <host> URL данного соединения
int getPort() — Получает поле <port> URL данного соединения
String getProtocol() — Получает поле <protocol> URL данного соединения
String getQuery() — Получает строку запроса URL данного соединения
String getRequestMethodf() — Получает текущий метод запроса (GET, POST и так далее)
String getRequestProperty (String key) — Получает значение свойства указанного общего запроса данного соединения
String getRef() — Получает поле <ref> URL данного соединения
String getURL() — Получает полный URL данного соединения как строковое значение
Использование соединений содержимого соединений. Сила, стоящая за использованием стандартных механизмов соединений содержимого соединений, заключается в том, что не требуется собственного проектирования для создания либо механизма доступа, либо согласованного формата полезного содержимого сообщений. Эта стандартизация служит мотивом поддержки механизма соединения HTTP в MIDP. HTTP является наиболее распространенным стандартным протоколом программного уровня в Интернете на сегодняшний день. Он дает вам возможность получать доступ к большому количеству разнообразных сетевых служб, поскольку поддерживает транспортировку произвольных данных с помощью своего механизма тегирования типа MIME.
Соединения HTTP могут транспортировать множество различных видов содержимого, такого, как HTML и XML. Кроме того, HTTP может использоваться как упаковщик для туннелирования других данных протокола уровня приложений. Вы, таким образом, имеете удобный механизм передачи данных для приложений клиент-сервер.
HTTP широко используется серверами как механизм передачи множества различных служб. Службы могут быть реализованы с помощью любой из множества технологий, независимо от того, что они используют HTTP в качестве механизма передачи. Службы могут быть реализованы с помощью сервлетов Java, Java Server Pages (JSP), Pearl scripts, CGI и так далее.
Модель сервлетов является особенно мощной, поскольку сервлеты написаны на Java и легко стыкуются с другими технологиями Java enterprise, они также без проблем взаимодействуют с клиентскими технологиями. Кроме того, сервлетные системы поддерживаются стандартными Web-серверами и могут без труда создавать выводимые данные в различных форматах. В главе 11 вы узнаете, как порталы беспроводного Интернета используют эти технологии для построения служб для мобильных устройств.
Дейтаграммные соединения и дейтаграммы
Интерфейс javax.microedition.io.DatagramConnecti.on дополняет Connection. Его положение в диаграмме иерархии наследования, показанной на рисунке 8.2, а также его название, предполагают, что дейтаграммные соединения являются на самом деле соединениями, хотя и отличными от других соединений потоков и содержимого соединений. В действительности интерфейс DatagramConnection описывает соединения, которые посылают и получают дейтаграммы через протокол дейтаграмм.
В мире сетевых технологий термин протокол дейтаграмм подразумевает облегченный протокол — протокол без установления состояний. Но само это отличие на самом деле не помогает объяснить его позицию в иерархии структуры общих соединений. Более правильно, вероятно, различать протоколы уровня приложений и низкоуровневые протоколы.
Термин протокол дейтаграмм обозначает протокол, который находится на более низком уровне в модели OSI, чем протоколы уровня приложений. Протоколы дейтаграмм переносят дейтаграммы, которые иногда называются пакетами. Эти протоколы обычно переносят сообщения дейтаграмм с одной машины на другую, основываясь исключительно на информации, содержащейся в этой дейтаграмме. Несколько пакетов, посланных с одной машины на другую, могут быть переданы по различным маршрутам и приходить на назначенный компьютер в любом порядке. Доставка пакетов в общем и целом не гарантирована.