Е. Буткевич Пишем программы и игры



страница12/15
Дата22.06.2019
Размер2.79 Mb.
ТипКраткое содержание
1   ...   7   8   9   10   11   12   13   14   15
Глава 14

Приложения

для работы с Интернетом

Большая часть возможностей мобильного телефона и реализации J2ME уже поза­ди. Мы написали несколько различных приложений, реализующих интеракцию с пользователем, хранение и обмен данными, а также другие функции языка. Мо­бильный телефон, однако, является все же средством связи и позволяет связывать­ся не только с помощью голоса или SMS. Профайл MIDP предоставляет нам воз­можности связи с Интернетом, получения и передачи различного вида данных.

Поскольку речь в этой главе пойдет о взаимодействии телефона с Интернетом, то придется расширять сферу нашего обучения с мобильного программирования до разработки серверных приложений на других объектно-ориентированных язы­ках. Тем, кто не знает, что такое сокет (socket), и не сталкивался с разработкой компьютерных приложений типа «клиент-сервер», придется трудновато. Однако один из приведенных примеров, демонстрирующий работу по протоколу HTTP, если уж вы дошли до этого места, реализовать вам вполне по силам. Разработка приложений типа «клиент-сервер» — это отдельная наука. Мы же ограничимся самыми простыми примерами, демонстрирующими первоначальное взаимодей­ствие телефона с Интернетом.

Класс Connector

Не буду забивать вам голову тем, как устроена связь между беспроводной сетью и Всемирной паутиной, а перейду сразу к делу, то есть к программированию. Се­тевая работа и беспроводная коммуникация осуществляются в реализации MIDP средствами пакета javax.m1croedition.io, который содержит набор интерфейсов для различных типов соединений, а также единственный класс Connector. Органи­зация соединений с любыми ресурсами осуществляется только через этот класс, который предоставляет следующие методы:

■ Connection open(String name) — основной метод класса Connector, обеспечива­ющий открытие соединения с ресурсом, представленным аргументом name. Ар­гумент имеет формат универсального идентификатора ресурса (URI), кото­рый можно представить следующей схемой:

<протокол>://[<адрес>][<параметры>]

Протокол представляет собой тип передаваемых данных. Реализация MIDP может поддерживать такие протоколы: http, socket, datagram, file, ftp, comm. Совсем не обязательно, чтобы ваша реализация MIDP поддерживала все эти



148 Глава 14. Приложения для работы с Интернетом

протоколы, поскольку спецификация MIDP требует обязательной поддержки только одного протокола HTTP 1.1. Не исключена также поддержка протоко­лов, не указанных в списке. Адресом является обычный URL; в качестве до­полнительных параметров может выступать номер порта. Ниже приведены примеры создания различных типов соединений.

Connector.open("http://www.voolkansoft. com"); Connector.open("socket://129.144.111.222:9000"); Connector. open(" datagram: //129.144. 111. 333"); Connector.open("file:/foo.dat"): Connector.open("comm:0;baudrate=9600");

Метод возвращает объект Connection, являющийся базовым для интерфейсов, представляющих различные типы соединений, которые мы рассмотрим позже;

■ Connection open(String name, int mode) — метод, аналогичный предыдущему,
с тем отличием, что параметр mode задает режим создаваемого соединения. Ре­
жимы соединений представлены следующими константами класса Connector:

• READ — открыть соединение с доступом только на чтение данных;



  • WRITE — открыть соединение с доступом только на запись данных;

  • READ_WRITE — открыть соединение с доступом и на чтение, и на запись данных;

■ Connection open(String name, int mode, boolean timeouts) — метод отличается от
двух предыдущих наличием дополнительного параметра timeouts — флага, ко­
торый разрешает или запрещает исключения от тайм-аутов.

Следующие методы класса Connector позволяют сразу открывать потоки ввода и вывода данных, рассмотренные в одной из предыдущих глав, минуя интерфейс Connection. Когда мы уже работали с потоками ввода и вывода, мы получали дан­ные из файла, являющегося локальным ресурсом приложения. Вся разница за­ключается в том, что ресурс будет размещаться в Интернете и предоставлять дан­ные в своем формате:



  • DatalnputStream openDatalnputStreairKString name) —открывает поток ввода дан­
    ных. Аргумент name имеет формат уникального идентификатора ресурса;

  • DataOutputStream openDataOutputStream( String name) —открывает поток вывода
    данных;

  • InputStream open InputStream( String name) —открывает базовый поток ввода дан­
    ных;

  • OutputStream openOutputStream(String name) —открывает базовый поток вывода
    данных.

Интерфейс Connection

Интерфейс Connection является базовым для всех последующих типов соедине­ний. Он содержит единственный метод closeO , закрывающий соединение, ко­торое открывается с помощью метода open О класса Connector. Этот интерфейс является самым абстрактным во всей структуре возможных типов соединений. Дальнейшие интерфейсы будут его расширять и дополнять новыми методами и возможностями.



Интерфейс StreamConnection 149

Итак, процесс установки соединения и работы с ним выглядит следующим обра­зом. Приложение использует класс Connector для открытия соединения с сетевым ресурсом. Метод ореп(...) класса Connector анализирует универсальный идентифи­катор ресурса и проверяет, поддерживается ли необходимый протокол в данной платформе. В случае ошибки формируется исключение, иначе возвращается объект Connection, который содержит ссылки на входной и выходной потоки к сетевому ресурсу. Приложение получает объекты типа InputStream и OutputStream из объекта Connection и организует обмен данными с сетевым ресурсом через эти потоки. При завершении работы приложение закрывает соединение с помощью метода close() интерфейса Connecti on.



Интерфейсы InputConnection и OutputConnection

Интерфейсы InputConnecti on и OutputConnecti on наследованы от интерфейса Connection и расширяют его потоками ввода и вывода соответственно. Каждый их них опреде­ляет по два новых метода для открытия потоков. Названия этих методов такие же, как и у методов открытия потоков класса Connector, и отличаются они лишь отсут­ствием аргументов. Использование этих методов открытия потоков мы еще уви­дим в примерах.



Интерфейс StreamConnection

Интерфейс StreamConnection объединяет в себе два предыдущих интерфейса InputConnection и OutputConnection, но не определяет никаких новых методов. За­дача этого интерфейса в том, чтобы представить любой тип соединения, чьи дан­ные могут быть обработаны как поток байтов. В зависимости от протокола соеди­нения активизируются разные реализации интерфейса StreamConnection. Наша среда разработки J2ME WTK предоставляет две реализации: одну для соедине­ния с портами связи, например с инфракрасным портом, вторую для соединения через сокеты. Мы рассмотрим второй тип соединения и реализуем пример, де­монстрирующий работу соединения такого типа.

Со кет (socket) — это сетевой механизм транспортного уровня, который реализует работу по протоколу TCP/IP. Грубо говоря, это та дверь, которая связывает про­грамму с Интернетом. Как любая порядочная дверь в большой мир, сокет имеет свой адрес, состоящий из сетевого адреса URL и номера порта, через который бу­дет осуществляться соединение. Номер порта может быть любым в диапазоне 0—65 535, однако номера, меньшие чем 1024, обычно зарезервированы системой. Структура сокета универсальна, поэтому программа, принимающая соединение, может быть запущена на любой платформе и написана на любом языке, поддер­живающем сокеты.

Итак, пришло время реализовать пример соединения, основанного на сокетах. Работа приложения будет заключаться лишь в том, чтобы соединиться с сервер­ной частью, послать туда приветствие, получить в ответ сообщение и продемон-



150 Глава 14. Приложения для работы с Интернетом

стрировать его на экране телефона. Для начала рассмотрим клиентскую часть программы, написанную на уже привычном для нас языке J2ME:

import javax.microedition.midiet.MIDIet; import javax.microedition. 10.StreamConnection; import javax.microedition.io.Connector; import java.io.IOException: import java.io.DataOutputStream; import java.io.DatalnputStream: import javax.microedition.lcdui.Form: import javax.microedition.lcdui.Display;

try {


// открыть соединение через сокет с портом 3000 локальной машины StreamConnection sc -

(St re amConnecti on )Con nector. open (" socket://127.0.0.1:3000м): // получить поток ввода соединения DatalnputStream dis • sc.openDatalnputStreamO; // получить поток вывода соединения Data Out put Stream dos = sc.openDataOutputStreamO; // записать приветствие в поток вывода dos,write("Hel1о. Server!\0".getBytes0.0,15); II буфер для приема сообщения byte[] buff = new byte[15]; // получить сообщение из потока ввода dis.read(buff);

// преобразовать сообщение в строку String msg - new String(buff): // создать форму для отображения сообщения Form form = new Form("Message received"); // добавить полученное сообщение в форму form.append(msg); // получить менеджер дисплея Display display - Display.getDisplay(this): // отобразить форму сообщения display.setCurrent< form); II закрыть соединение sc.closeO:

} catchdOException ioe) {

// вывести исключение в область системных сообщений System.out.println("ERROR: "+ioe.getHessageO):

С этой стороны нет ничего сложного. Приложение открывает соединение черезсокет с портом 3000 локальной машины, представленной постоянным для любого компью­тера IP-адресом 127.0.0.1. После установки соединения приложение получает пото­ки ввода и вывода соединения и через них реализует интеракцию с серверной частью.



Интерфейс StreamConnection 151

Перейдем к тому, что представляет собой серверная часть. В нашем случае это программа, запущенная на локальном компьютере, открывающая сокет и ждущая связи с клиентом. Программу напишем на языке C++ с использованием классов MFC. С таким же успехом она может быть написана на любом языке, поддержи­вающем технологию сокетов.

Язык C++ не входит в нашу учебную программу, поэтому не будем особо вдаваться в подробности, а просто посмотрим на код некоторых функций, который может быть кому-то полезен. Рассмотрим две основные функции: OnListerK), которая открыва­ет сокет, ожидающий клиентского соединения, и OnReceive(), которая обрабатывает событие получения сообщения. Функция отображаемого диалога OnListerK) вызы­вается при нажатии на кнопку Listen основного диалога: void CServerDlg::OnListen()

{

// получить информацию из поля ввода порта



UpdateDataO;

// создать сокет с локальным адресом

if (m_Sock->Create(m_Port.SOCK_STREAM."127.0.0.1"))

I

// ждать связи с клиентом if (m_Sock->Listen()) {

// вывести сообщение с номером порта сокета CStatic* stat = (CStatic* )GetDlgItem(IDC_STATIC ) ; CString str:

str.Format("Listening on port M". m_Port): stat->SetWindowText(str); // вывести IP-адрес сокета stat = (CStatic* )GetDlgI tem (IDC_MSG): UINT port;

m_Sock->GetSockName(str.port) ; stat->SetWindowText(str); } J }

Функция использует член класса диалога m_Port, связанный с полем ввода порта, и m_Sock, являющийся объектом класса CListenSocket, наследованный от стандарт­ного MFC-класса CSocket. При нажатии на кнопку Listen диалог выдаст такие со­общения (рис. 14.1).

Вторая функция OnRecei ve() класса CLi stenSocket отслеживает момент приема сооб­щения через сокет, выводит его в окне диалога и посылает ответ клиентскому при­ложению: void CListenSocket::OnReceive(int nErrorCode)

I

// поля диалога для вывода сообщений

CStatic* stat * (CStatic*)Cm_pDlg->GetOlgItenitIDC_STATIC)); CStatic* statjnsg = (CStatic*)(m_pDlg->GetDlgItem(IDC_MSG)); // буфер приема сообщения

152

Глава 14. Приложения для работы с Интернетом



TCHAR buff[20];

// прочитать сообщение в буфер

Rece1ve(&buff:20):

// вывести подтверждение получения сообщения

stat->SetWindowText(_T("Message Received..."));

CString str;

str.Format("Is",buff):

// вывести полученное сообщение

stat_msg->SetWindowText(str):

// копировать ответ в буфер

strcpy(buff."Hello. MIDlet!\0"):

// послать ответное сообщение

Send(&buff,15);

4j* Server

Listening 9"PWl ЭКЮ ч

1270.0.1

Рис. 14.1. Сервер сообщает, что слушает порт 3000 локальной машины

Те, кто уже знаком со студиями р'азработки C++, без труда смогут реализовать данный пример, остальные же без труда смогут найти книжки о разработке визу­альных приложений на языке C++.

Перейдем к самому интересному, сначала запускаем серверную часть и ждем со­единения клиента, в качестве которого будет выступать стандартный эмулятор среды разработки J2ME WTK. При запуске мобильного приложения сервер об­наружит связь и получит сообщение от телефона (рис. 14.2).



:Не8о S

Рис. 14.2. Сервер получил сообщение и вывел его в окне

После приема сообщения сервер формирует в ответ свое приветствие и посылает его мобильному приложению, которое отображает принятое сообщение с помо­щью обычной формы (рис. 14.3).


Интерфейс DatagramConnection 153

Это был простейший пример, шапочное знакомство сервера с телефоном на уровне «привет-привет». Тем не менее, это и есть самый сложный момент. Если уж наши программы встретились и поздоровались, то и до­говориться смогут, а о чем им договариваться — зави­сит только от нашей фантазии, простор для которой здесь ничем не ограничен. Можно разработать инфор­мационную систему, многопользовательскую онлайн-игру, оперативный центр сбора и обработки информа­ции и многое другое. Сервер — программа, размещенная в Интернете, — должна взять на себя все организаци­онные функции общения с клиентами, которых может быть сколь угодно большое число, причем одновремен­но. В классических сервер-приложениях отдельный тред отводится для ожидания связи с новым клиентом, для каждого из которых выделяется собственный тред. Та­ким образом, клиенты не будут мешать друг другу, од­нако вопросы синхронизации при доступе к общим дан­ным встают особо остро.

Заметим, что не все реализации поддерживают сокет-ные соединения, поэтому вполне возможна ситуация, что при попытке создания соединения на вашем аппарате будет сформировано исключение. Например, при попыт­ке запуска того же самого приложения на эмуляторе от Nokia мы получим в системной области следующее со­общение: «ERROR: The requested protocol does not exist socket://127.0.0.1:3000».



Рис. 14.3. Эмулятор принял

и отобразил приветствие

сервера


Интерфейс StreamConnectionNotifier

Функции сервера может выполнять и мобильный телефон с помощью интер­фейса StreamConnectionNotifier. Этот интерфейс содержит единственный метод StreamConnectionacceptAndOpenО, который блокирует все операции до тех пор, пока не появится клиентский запрос на соединение. После чего метод создает новый объект соединения, через который и связывает серверную часть с клиентской. При использовании данного интерфейса в качестве сервера будет выступать мо­бильное устройство. Недостатки такой реализации заключаются в том, что уст­ройство должно быть постоянно на связи в ожидании подключения клиентов, что может быть дорого и неудобно.



Интерфейс DatagramConnection

Еще один тип соединений представлен интерфейсом DatagramConnection, который напрямую наследован от интерфейса Connection. Если соединение через сокеты основывалось на протоколе TCP, то данное соединение использует протокол пе­редачи дейтаграмм UDP. Данный протокол используется различными интернет-



154 Глава 14. Приложения для работы с Интернетом

службами потоковых трансляций и основан на передаче дейтаграмм. В некото­рых случаях он является более предпочтительным из-за эффективной и быстрой пересылки данных, поскольку там нет гарантированной доставки сообщений, ис­правлений искаженных сообщений и другого контроля, нагружающего связь.

Дейтаграмма представлена интерфейсом Datagram, который объединяет в себе два интерфейса Data Input и DataOutput. Кроме этого интерфейс содержит информацию о передаваемых или принимаемых данных и об адресе пункта назначения. Интер­фейс Datagram предоставляет следующие методы:

■ String getAddressO — установить адрес дейтаграммы;

■ byte[] getDataO —возвращает данные дейтаграммы;
и int getLengthO — возвращает длину дейтаграммы;


  • int getOffsetC) — возвращает текущее смещение указателя буфера данных;

  • void reset() — восстанавливает позицию указателя буфера данных;




  • void setAddress( Datagram reference) — устанавливает такой же адрес, как и у дей­
    таграммы, переданной в параметре;

  • void setAddress(String addr) — устанавливает адрес дейтаграммы;

  • void setData(byte[] buffer, int offset, int 1en) — устанавливает буфер дан­
    ных, смещение указателя буфера и длину данных;

  • void setLengthd'nt Ien) — устанавливает длину полезной нагрузки дейтаграммы.

Интерфейс DatagramConnection позволяет отправлять и получать дейтаграммы с помощью методов send(Datagram dgram) и receive(Datagram dgram). Также интер­фейс позволяет создавать новые дейтаграммы с помощью нескольких методов:

  • Datagram newDatagram(byte[] buf, int size) — возвращает новую дейтаграмму
    с данными буфера buff длины size;

  • Datagram newDatagram(byte[] buf, int size, String addr) — аналогиченпредыду­
    щему методу, параметр addr задает адрес дейтаграммы;

  • Datagram newDatagram(int size) — создает новую дейтаграмму заданного размера;

  • Datagram newDatagramd'nt size. String addr) — создает новую дейтаграмму
    с заданным размером и адресом.

Максимально допустимую длину дейтаграммы, а также номинальную длину дей­таграммы можно получить с помощью методов int getMaximumLengthO и int

getNominalLengthO .

Также как и StreamConnection, интерфейс DatagramConnection может быть использо­ван как для клиентской, так и для серверной частей приложения. Если при созда­нии дейтаграммы в параметре адреса не будет указано имя хоста (datagram://: 3000), то соединение будет работать в серверном режиме. Если имя хоста будет указано (datagram://127.0.0.1:3000), то соединение будет работать в клиентском режиме.

Интерфейс ContentConnection

Интерфейс ContentConnection дополняет интерфейс StreamConnection. Главное от­личие заключается в том, что если раньше интерфейс не вникал в суть передава-

Интерфейс HttpConnection 155

емых данных, то теперь из него можно извлечь некоторую информацию, опреде­ленную самим протоколом, с помощью следующих методов:



  • String getTypeO — возвращает тип данных, передаваемых по протоколу. Для
    протокола HTTP метод возвратит содержимое поля content-type заголовка;

  • String getEncodingO) — возвращает кодировку данных. Для протокола HTTP
    возвращается содержимое поля content-encoding заголовка;

  • 1ong getLength() — возвращает длину доступных данных. Для протокола HTTP
    возвращается содержимое поля content-length заголовка. Если сведения о дли­
    не недоступны, то метод возвращает значение -1.

Интерфейс HttpConnection

Самым продвинутым интерфейсом во всей этой иерархии является интерфейс HttpConnection, представляющий соединения, использующие протокол HTTP. По этому протоколу организуется передача всех знакомых нам интернет-страниц.



Интерфейс HttpConnection реализует возможность получения информации полей HTTP-заголовка ресурса, а также поддерживает передачу запросов и получение откликов по протоколу HTTP. Кроме этого интерфейс определяет полный набор констант, представляющих коды ошибок и статуса протокола HTTP. Интерак­ция с веб-сервером осуществляется с помощью следующих методов интерфейса:

  • long getDate( ) — возвращает дату из соответствующего поля заголовка. Дата
    по традиции представлена количеством миллисекунд, прошедших с 1 января
    1970 года;

  • long getExpi ration () — выдает значение поля expires заголовка;

  • String getFi 1 е() — возвращает имя файла из поля URL данного соединения;

  • String getHeaderField(int n) — выдает значение поля заголовка с номером п;

  • String getHeaderFi eld (String name) — возвращает значение поля заголовка, оп­
    ределенного ключом name. Если заголовок не содержит поля с запрошенным
    именем, то возвращается значение nul 1;

  • long getHeaderFi el dlntC String name, long def) — возвращает поле заголовка
    с именем name, представленное как целое число. Значение def возвращается,
    если поле с данным именем отсутствует или значение поля нельзя преобразо­
    вать в целое число;

  • long getHeaderFi el dDate CString name, long def) — аналогично предыдущему
    методу возвращает запрошенное поле заголовка, представленное в виде даты;

  • String getHeaderFi el dKey(int n) — возвращает имя поля заголовка с порядко­
    вым номером п;

м String getHost() — получить имя хоста соединения или IP-адрес, если имя хо­ста не задано;

  • long getLastModifiedO — возвращает дату последней модификации ресурса,
    представленную полем last-modified заголовка;

  • int getPort( ) — возвращает номер порта соединения; 80 — стандартный номер
    порта HTTP-соединений;

156 Глава 14. Приложения для работы с Интернетом

  • String getProtocol() — получить имя протокола соединения;

  • String getQuery() — выдает область запроса адреса URL. Эта часть начинается
    после знака ? в строке адреса;

  • String getRef () — выдает область адреса URL, следующую после знака #;

  • String getRequestMethocK) — возвращает установленный метод HTTP-запроса;

  • String getRequestProperty(String key) — возвращает установленное свойство
    key HTTP-запроса;

  • int getResponseCode() — получить код ответа сервера. Всевозможные коды от­
    вета представлены в интерфейсе константами HTTP_ACCEPTED, HTTP_BAD_GATEWAY,
    HTTP_NOT_FOUND, HTTPJORBIDDEN, HTTP_OK и т. д. Все 38 констант приводить здесь
    не вижу смысла: кому понадобится, найдет их в документации;

  • String getResponseMessage() — получить ответ сервера в виде строки с сообще­
    нием;

  • String getURLC) — возвращает адрес URL соединения;

  • void setRequestMet hod CString method) — установить метод HTTP-запроса. До­
    пустимы методы, представленные следующими константами интерфейса: GET,
    POST, HEAD;

  • void setRequestProperty( String key. String value)—установить значение value
    свойству key запроса.

Следующий пример, который мы реализуем, получит по протоколу HTTP дан­ные интернет-страницы, а затем пошлет сообщение в гостевую книгу, разме­щенную в Интернете. В данном случае нам потребуется реализация лишь кли­ентской части приложения, поскольку серверная часть представлена обычным веб-сервером, с которым мы связываемся с помощью браузера, заходя на стра­ницу в Интернете.

Для реализации нам потребуются некоторые знания самого протокола, а также языка HTML. Опыты мы будем производить над гостевой книгой официального сайта ФК «Томь», расположенной по адресу football.tomsk.ru/gb. Только лишь из большого уважения к этой команде, а не с целью как-то навредить. Для начала стоит взглянуть, как устроена гостевая книга внутри, благо на любой странице можно щелкнуть правой кнопкой и выбрать команду Просмотр в виде HTML, что позволит нам увидеть весь код страницы в текстовом виде. Немного поковыряв­шись, выясняем всю необходимую нам информацию: сообщения добавляются с помощью HTTP-запроса POST и скрипта add. php. Параметры сообщения переда­ются скрипту из формы в переменных username, city, emai1, homepage и message. Этой информации нам вполне достаточно, чтобы реализовать нашу затею.

Вот как будет выглядеть наше приложение, которое соединится с HTTP-серве­ром, отправит запрос с помощью метода POST, а затем получит различную инфор­мацию о сервере и параметрах соединения:

import javax.microedition.midlet.MIDIet: import javax.microedition.io.HttpConnection: import javax.microedition.io. Connector: import java.io.OutputStream; import java.io.IOException;



Интерфейс HttpConnection 157

try {


// открыть соединение с HTTP-сервером HttpConnection conn •

(HttpConnection) Connector. openC'http://football.tomsk.ru/gb/add.php"): // установить метод запроса conn.setRequestMethod("POST"); // установить свойства запроса conn.setRequestProperty( "Connection", "close"):

conn.setRequestProperty("User-Agent". "Co nnect Demo (MIDP-1.0: J2ME)"): conn. set RequestProperty( "Content-Type".

"appl ication/x-www-form-urlencoded"); conn. setRequestProperty(" Accept". "text/plain"); // получить поток вывода соединения OutputStream os - conn.openOutputStreamO; // записать параметры запроса POST в поток вывода os .wri te( "username=Nokia7210&message=WeAreTheChampions" .getBytes()): // получить код ответа сервера

System.out.printlnC'Response Code: "+conn.getResponseCodeO): // получить текстовый ответ сервера

System.out.println("Response Msg: "+conn.getResponseMessage()): //получить базовые параметры соединения System. out. println( "Type: "+conn.getType()): System.out.println( "Length: "+conn.getLength()); System.out.println("Encoding; "+conn.getEncoding()); // получить в цикле имена и значения полей заголовка for(int i=0;i<12;i++)

System.out.println(conn.getHeaderFieldKey(i)+

": "+conn.getHeaderField(i)): // получить и вывести параметры соединения System.out.printlnC'Data: " + conn.getDateO); System.out.printinCHost: " + conn.getHostO): System, out. println("Port: " + conn.getPortO); System,out.println("Protocol: " + conn.getProtocolO): System,out.println("Query: " + conn.getQueryO); System.out.printlnC'Ref: " + conn.getRefO); System.out.printlnt"Request Method: " + conn.getRequestMethodO): System,out.println("URL: " + conn.getURLO): // закрыть соединение conn.cioseO:

}

catchCIOException ioe) {



// вывести сообщение об исключении

System.out.printl n( "ERR: "+ioe.getMessageO) :



158 Глава 14. Приложения для работы с Интернетом

Если у вас есть выход в Интернет, то можно запускать приложение прямо на эму­ляторе. Если вы используете прокси-сервер, то следует указать его адрес в свой­ствах эмулятора. После запуска смотрим в области системных сообщений J2ME WTK, насколько успешно мы соединились, анализируя ответы и параметры сер­вера (рис. 14.4).



«ЖJ2ME Wireles* Imfcit -

-!>roi»et:

Build I

Run l

^еэрстзе Code: 302

Respcnie H5

Encoding: null

date: Wed, OS Oct 200S 21:25:01 GHT

server: Apache/1.3.29 (Unix) modjMicro/lЛ.2 php/4.3.4 mod_ssl/2.8.16 OpenSSL/0.9.6g гиэ/Р130.19

<-poKered-by: PHP/4. 3.4 | s «t-c ooki e: ?HJ>3E53ID-e5ce3e4c6b539791f£ae4»eeli359a25;

expires: Thu, 19 Nov 1981 08:52:00 GMT

cache-control: no-store, no-cache, must- revalidate, post-check=0, pre-check-0 pragma: no-cache

set-cookie: gbcookieid=1128547501; expires»Fri, 04-Nov-05 21:25:01 GHT

set-cookie: gbusername=Nokia7210; expires«Fri, 04-Nov-05 21:25:02 GHT

set-cookie: gbcity=deleted; expires=Tue, 05-0ct-04 21:25:01 GKT

set-cookie: gbemail=dele ted; expires=Tue, 05-0ct-04 21:25:01 GHT

set-cookie: gbhomepage= dele ted; expires=Tue, 05-0ct-04 21:25:01 GHT

Data: 1128547501000

Host: football. tomsk. ru

Port: 80

Protocol: http

Query: null

Ret: null

Request Method: POST

URL: http://football. tonsk.ru/gb/add.php

Рис. 14.4. В области системных сообщений выведена информация о соединении с сервером

Видим, что свойства сервера нами успешно получены. Заметьте, что для тестиро­вания программы на реальном аппарате и для успешного соединения с интернет-ресурсом на телефоне должен быть активирован WAP-сервис. Теперь осталось зайти на гостевую книгу по вышеуказанной ссылке и посмотреть результат наше­го эксперимента (рис. 14.5).

Интересна реализация следующей идеи: отправка S MS-сообщений с сайта сотовой компании, например www.mts.ru, что, возможно, даст некоторую экономию при по­сылке SMS. Основная проблема заключается в том, что на сайте введена спам-за-щита в виде картинки с трудночитаемыми цифрами и буквами, которые надо ввес­ти в специальном поле. Обойти это можно следующим способом: проанализировать HTML-текст сайта, получить ссылку на файл картинки, продемонстрировать ее на экране мобильника и попросить пользователя ввести пароль вручную. Здесь нас ожидает очередная проблема: формат картинки J PEG не совпадает с форматом PNG, поддерживаемым телефонами, поэтому для отображения следует сначала конвер­тировать картинку в нужный нам формат. Можно поискать готовый класс конвер-



Интерфейс HttpConnection 159

тора (что-нибудь с именем JpegViewer, например), который можно встроить в при­ложение, или самому связаться с таблицами Хофмана и прочими премудростями структур графических файлов. Первый путь значительно проще, однако над реали­зацией такого приложения придется изрядно потрудиться. А вам слабо?







«ьноеить




Уважаемые болелы Мики! До Ьто октября вы можете дублирующего состава "Томи" Эдуарду Барышеву,



Рис. 14.5. В гостевой книге появилось сообщение от Nokia7210

Таким образом, полную иерархию всех рассмотренных типов соединений можно представить следующей схемой (рис. 14.6).





Da tag га m С on n ection

InputConnection

onStreamC on nectio n

Stream Connecti o n Notifer

/

StreamConnection

ContentConnection

HttpConnection



Рис. 14.6. Иерархия типов соединений

160 Глава 14. Приложения для работы с Интернетом

Мы рассмотрели все типы соединений этой иерархии, выделив четыре основных типа: потоковые соединения с коммуникационными портами, например IRDA, соединения уровня приложений по протоколу HTTP, либо через сокеты по про­токолу TCP/IP, дейтаграммные соединения по протоколу UDP. Из всех этих ти­пов спецификация MIDP определяет обязательную реализацию лишь для под­держки протокола HTTP. Попытка использования остальных типов соединений может сформировать исключение на вашей модели телефона.

Информация, приведенная в этой главе, является лишь базовыми сведениями для программирования сетевых приложений. Никто не говорит, что, потратив несколь­ко минут на чтение, вы сможете написать интернет-браузер для вашего мобиль­ника, однако, приложив некоторые усилия, организовать общение вашего теле­фона с интернет-ресурсами вам вполне по зубам. И да пребудет с вами сила!


Каталог: Техника -> Информационные%20технологии
Информационные%20технологии -> Методические рекомендации по построению систем защиты узлов интернет 1 требования к системе защиты узла интернет 2
Техника -> Учебная программа для специальности: 1-23 01 73 Средства массовой информации
Техника -> Ремонт китайских телефонов
Техника -> Для профилактики и лечения насморка Зачем промывать нос во время насморка?
Техника -> Учебная программа для специальности: 1-23 01 73 Средства массовой информации


Поделитесь с Вашими друзьями:
1   ...   7   8   9   10   11   12   13   14   15


База данных защищена авторским правом ©vossta.ru 2019
обратиться к администрации

    Главная страница