Você está na página 1de 50

INTRODUÇÃO A J2ME

Prof. Dany Sanchez Dominguez


dany@labbi.uesc.br
NBCGIB – Sala 01

Especialização em Sistemas Embarcados


UESC - 2010

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 1


Tema 5

Conexões em J2ME
Conexão HTTP

Especialização em Sistemas Embarcados


UESC - 2010

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 2


Sumário - 1
• Introdução
• Generic Conection Framework
• Classes InputStream e OutputStream
• Conexão HTTP
• Enviando parâmetros com GET
• Enviando parâmetros com POST
• Processando a resposta
• Processando imagens
Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 3
Introdução

conexão

• thin client • heavy process


• front end • back end
• coleta informações • processa transações
• interface usuário • precisa infraestrutura
• sem infraestrutura
• sem mobilidade
• mobilidade

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 4


Introdução
• Uma conexão é um caminho entre dois
dispositivos que utiliza uma rede física
(cabeamento) ou tecnologia sem fio,
• Uma conexão permite enviar e receber
dados usando a rede,
• Para estabelecer uma conexão entre dois
dispositivos são necessários três elementos:
 endereço de rede
 protocolo de comunicação
 parâmetros de comunicação (opcional)
Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 5
Introdução
• Endereço de rede:

 é um endereço unico que identifica um


dispositivo em uma rede,
o endereço IP é a técnica de
endereçamento mais comum,
 outra alternativa é usar nomes de
dominios (DNS).

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 6


Introdução
• Protocolo de comunicação:

 um conjunto de regras que descrevem


como os dados são intercambiados entre
os dispositivos,
 ambos dispositivos devem dar suporte ao
protocolo de comunicação escolhido,
 HyperText Transfer Protocol (HTTP),
 File Transfer Protocolo (FTP),
 Sockets.
Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 7
Introdução
• Parâmetros de comunicação:

 informação necessária para abrir a


comunicação entre os dispositivos,
 autenticação (login e senha)
 estes parâmetros são opcionais.

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 8


Introdução
• O pacote de classes java.io e java.net no
J2SE possuem centenas de classes e
interfaces que facilmente ultrapassam os
recursos disponíveis em muitos dispositivos
móveis,
• J2ME implementa um subconjunto de
classes do J2SE mais adequado às
limitações e variações encontradas em
dispositivos que implementam o MIDP,

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 9


Introdução
• Implementações MIDP possuem dois
pacotes de classes para o suporte aos
diversos tipos de conexões:
 java.io, Fornece suporte a entrada e
saída através de fluxos de dados
(streams)
 java.microedition.io, Fornece suporte ao
Generic Connection Framework

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 10


Generic Conection Framework
• Para criar conexões em J2ME usamos o
Generic Connection Framework (GCF),
• O GFC contempla:
 uma estrutura extensível de I/O
(memórias e sistema de arquivos)
 e interligação em rede.
• A classe Connection é o centro da GCF.
• Esta classe fornece o método para fabricar
qualquer tipo de conexão em J2ME.
Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 11
Generic Conection Framework
• Os construtores da classe Connection
permitem criar e abrir conexões em J2ME:
static Connection open(String name)
static Connection open(String name, int mode)
static Connection open(String name, int mode,
boolean timeouts)

• O método open irá a retornar um objeto que


implementa alguma das interfaces do GCF.

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 12


Generic Conection Framework
• Atributos do conection.open():
 String name: “protocolo:endereço;parâmetros”
 Protocolo: é o tipo do protocolo (e.g., http)
 endereço: algum tipo de endereço de rede
 Parâmetros: Sequência tuplas do tipo
atributo=valor
 int Mode: READ, WRITE, READ_WRITE
 Flag para indicar ao gerenciador do protocolo a
direção do fluxo de informações, (default
READ_WRITE)
 Boolean timeouts: Flag para indicar que o código
de chamada lida com exceções de tempo-limite
esgotado.
Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 13
Generic Conection Framework

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 14


Generic Conection Framework
• As implementações:
 MIDP 1.0 exige a implementação da
conexão HTTP
 MIDP 2.0 exige a implementação da
conexão HTTP e HTTPS
 o suporte as outras conexões é sugerido,
depende da implementação.
• Exemplo:
Connection connection = Connector.Open(
"http://www.myweb.com");
Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 15
Classes do pacote java.io
• InputStream, define uma interface para ler
dados de uma conexão aberta,
• Os métodos relevantes são:
 read(), retorna um byte de dados como enteiro
da conexão aberta, se o final da stream é
alcançado retorna -1,
 read(byte []), os dados são recuperados no array
byte, retorna um inteiro com o número de bytes
lidos,
 reset(), retorna o cursos a posição inicial da
stream,
 close(), fecha a stream de leitura.
Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 16
Classes do pacote java.io
• OutputStream, define uma interface para
escrever dados de uma conexão aberta,
• Os principais método são:
 write(int), escreve um byte na stream,
 write(byte []), escreva todos os elementos do
array byte na stream,
 flush(), se a comunicação estiver bloqueada
efetiva a gravação dos dados na stream
(depende da implementação),
 close(), fecha a stream de escrita.

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 17


Conexão HTTP
• HTTP é um protocolo do tipo pedido-resposta (request-
response),
• Um cliente envia um pedido (request) para um servidor,
o servidor prepara os dados e envia de volta ao cliente
(response):

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 18


Conexão HTTP
• Um pedido do cliente consiste de três
seções:
 Método – maneira como será feito o
pedido, estabelece a forma de envio dos
dados e o tipo de resposta,
 Header – Informações de cabeçalho do
pedido, fornece informações ao servidor
sobre como processar o pedido,
 Corpo – Dados a serem enviados ao
servidor.
Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 19
Conexão HTTP
• Métodos do pedido:
 GET – é um tipo de pedido onde os
parâmetros são passados juntos com a URL
em uma única stream,
 POST - é um tipo de pedido onde os
parâmetros são passados em uma stream
separada da URL,
 HEAD - é um tipo de pedido onde somente
meta-informações sobre a resposta são
enviadas de volta pelo servidor.
Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 20
Conexão HTTP
• Informações de cabeçalho:
 O Header de um pedido é formado por tuplas
do tipo atributo=valor,
 O protocolo HTTP define alguns campos de
cabeçalho usuais:
 If-Modified-Since=29 Oct 1999 19:43:31 GMT
 User-Agent=Profile/MIDP-2.0 Configuration/CLDC-1.0
 Content-Language=pt-BR
 Pode-se utilizar qualquer par atributo=valor
que possa ser processado pelo servidor.

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 21


Conexão HTTP
• Uma conexão HTTP pode existir em um dos
três estados:
 Setup, neste modo os parâmetros da
conexão e da requisição podem ser
definidos.
 Connected, a requisição foi enviada e
uma resposta é aguardada.
 Closed, a conexão foi fechada.

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 22


Conexão HTTP
• Para obtermos uma conexão HTTP
(HttpConenection) usamos o método open()
da classe Connector,
• Uma typecast explícito é necessário:
HttpConnection httpc = (httpc)
Connector.open("http://labbi.uesc.br/dany/");

• Após a chamada a conexão se encontra no


modo Setup.

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 23


Conexão HTTP
• No modo Setup podemos evocar os
métodos:
setRequestMethod(String method)

 Estabelece o método do pedido (GET,


POST ou HEAD)
setRequestProperty(String key, String value)

 Estabelece uma propriedade de


cabeçalho para o pedido,
 Adiciona a tupla key=value ao cabeçalho.
Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 24
Conexão HTTP
• Exemplo:

httpc =(HttpConnection)
Connector.open("http://labbi.uesc.br/dany/j2me/");
httpc.setRequestMethod(HttpConnection.GET);
httpc.setRequestProperty("User-Agent",
"Profile/MIDP-2.0 Configuration/CLDC-1.1");
httpc.setRequestProperty("Accept_Language","pt-BR");

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 25


Conexão HTTP
• Em qualquer modo podemos obter
informação sobre a conexão usando os
métodos:
 getRequestMethod()
 getURL()
 getProtocol()
 getHost()
 getPort()
 getQuery()
Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 26
Conexão HTTP
• A resposta de uma requisição HTTP conta
com um grupo de atributos de cabeçalho,
• Existem três atributos de cabeçalho que
estão presentes em toda resposta:
 date, a data de quando o cabeçalho foi criado,
 expiration, a data a partir da qual a informação
do cabeçalho é inválida (0 para infinito),
 last modified fields, a data da última
modificação dos atributos de cabeçalho.

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 27


Conexão HTTP
• Para recuperarmos esses atributos temos os
métodos:
 getdate()
 getExpiration()
 getLastModified()

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 28


Conexão HTTP
• Outros atributos de cabeçalho podem ser
enviados a critério do servidor,
• Atributos de cabeçalho recebem um índice
enteiro (0..n-1)
• Para recuperarmos um atributo de
cabeçalho qualquer usamos o método:

public String getHeaderField(String name)


public String getHeaderField(int index)

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 29


Conexão HTTP
• Exemplo:
 Criando uma conexão HTTP,
 Especificando o método e o cabeçalho do
request,
 Mostrando os atributos da conexão,
 Mostrando o cabeçalho da resposta.

 MIDlet Name: Criando uma conexão


 MIDlet Class: HTTPConnectionMIDlet
Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 30
Passando parâmetros - GET
• Parâmetros são codificados pela aplicação
cliente,
• São enviados ao servidor junto com o URL na
forma de pares nome=valor,
• Múltiplos parâmetros são separados por &,
• Regras para codificação de parâmetros:
 O espaço em branco é convertido para o sinal
de +
 Os caracteres a..z, A..Z, 0..9, . , -,* e _ são
mantidos inalterados
 Todos os outros caracteres são convertidos
para o formato %xy, onde xy é a representação
hexadecimal do caractere.
Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 31
Passando parâmetros - GET
• Exemplo:
HttpConnection httpc = (HttpConnection)
Connector.open("http://labbi.uesc.br/ok.php
?Nome=Dany+Sanchez&email=dany%40labbi.uesc.
br");

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 32


Passando parâmetros - POST
• No método POST os dados são enviados
ao servidor em uma stream independente,
• Os dados não aparecem na URL da
requisição,
• Oferece maior segurança, não significa que
os dados não possam ser lidos,
• Para usarmos o método POST devemos
criar uma OutputString
• Os parâmetros devem ser copiados nessa
string na forma de tuplas atributo=valor.
Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 33
Passando parâmetros - POST
• O cabeçalho da requisição deve ter a
propriedade:
Content-Type=application/x-www-form-urlencoded

• Exemplo:
String params = "login=dany&senha=123";
OutputStream os = null;
httpc = (HttpConnection) Connector.open(link);
httpc.setRequestMethod(HttpConnection.POST);
os = httpc.openOutputStream();
os.write(params.getBytes());
os.flush();
Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 34
Enviando uma requisição
• Para enviar uma requisição ao servidor a
conexão deve pasar do estado Setup ao
Connected,

• Os métodos que processam o cabeçalho


da resposta enviam a requisição ao
servidor,

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 35


Enviando uma requisição
• Métodos que enviam uma requisição ao
servidor:
 openInputStream(), associa uma string de bytes a
conexão.
 openDataInputStream(), associa uma string de dados
a conexão.
 getLength(), retorna o tamanho da resposta em
bytes,
 getType(), retorna uma string com o tipo de resposta,
 getEncoding(), retorna uma string com o tipo de
codificação usado na resposta,
 getResponseCode(), retorna um inteiro com o código
do status da resposta,
 getResponseMessage(), retorna uma string com a
menssagem de estatus da resposta.
Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 36
Resposta HTTP
• Um resposta do servidor consiste de três
seções:

 Status – indica o resultado do pedido


(erro ou bem sucedido)
 Header – Informações de cabeçalho da
resposta
 Corpo – Dados que foram enviados pelo
servidor ao cliente.

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 37


Resposta HTTP
• O protocolo HTTP divide o status de uma
reposta em cinco classes:
 1xx – Informação
 2xx – Sucesso
 3xx – Redirecionamento
 4xx – Erro do cliente
 5xx – Erro do servidor
• Exemplos:
 100 Continue
 200 Ok
 300 Multiple Choices
 400 Bad Request
 500 InternalServer Error

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 38


Resposta HTTP
• Antes de processarmos uma resposta do
servidor devemos verificar se a requisição
teve uma resposta satisfátoria,
• Usamos os métodos:
 String getResponseMessage(), retorna o
texto do status (e.g.,”Ok”)
 int getResponseCode(), retorna o código do
status (e.g., 200)
• O código do status é comparado a constante
HTTP_OK.
Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 39
Resposta HTTP
• Exemplo:

int rc = httpc.getResponseCode();
if (rc == HttpConnection.HTTP_OK) {
//Conexao OK
}
else{
//Falha na conexao
}

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 40


Resposta HTTP
• A Interface HTTPConnection não define
nenhum método para ler o corpo de uma
resposta,
• A maneira mais usual é obter o corpo da
resposta através de uma stream
(InputStream),
• Então processamos a stream para obtermos
os dados da resposta.

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 41


Resposta HTTP
• Passos:
1. Obter a Stream de entrada da HttpConnection
através do método openInputStream(). Este
procedimento envia o header do request para o
servidor
InputStream is = httpc.openInputStream();
2. Processar o conteúdo da resposta do servidor
armazenado na InputStream
StringBuffer strbuf = newStringBuffer();
int currInput;
while((currInput = is.read()) != -1) {
strbuf.append((char) currInput);
}
Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 42
Fechando uma conexão
• Após finalizado o processamento da
resposta devemos fechar a conexão e as
streams utilizadas,

• Fechar a conexão retorna os recursos


utilizados para o dispositivo,

• Para fecharmos uma conexão usamos o


método close().

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 43


Transmissão em Background
• Uma prática recomendada é realizarmos as
operações de rede em background,
• Istó é, permitir que o usuário realize outras
operações na aplicação enquanto a
transmissão esta sendo executada,
• Execute as operações de comunicação em
background utilizando uma thread,
• Melhora o desempenho da aplicação.

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 44


Transmissão em Background
• Para transmitir em background:
1. Crie uma classe independente para
efetuar a transmissão,
2. Esta classe deve implementar a
interface Runable,
3. O método Run da classe realizara as
operações de transmissão,
4. Crie uma tread para executar a classe,
5. Chame o método start() da thread,

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 45


Usando GET
• Exemplo:
 Enviando informação ao servidor usando GET,
 Processando a resposta do servidor como um
arquivo texto,
 Verificando erro na conexão,
 Transmitindo em background,
 MIDlet Name: Enviando com GET
 MIDlet Class: HTTPConnectionMIDletGet
HTTPConnectionGetReadTXT
 Servidor: olaget.php

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 46


Usando POST
• Exemplo:
 Enviando informação ao servidor usando
POST,
 Processando a resposta do servidor como um
arquivo texto,
 Verificando erro na conexão, transmitindo em
background,
 MIDlet Name: Enviando com POST
 MIDlet Class: HTTPConnectionMIDletPOST
HTTPConnectionPOSTReadTXT
 Servidor: olapost.php
Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 47
Recebendo uma imagem
• Uma MIDlet pode receber uma imagem do
servidor,
• O recibimento e processamento da imagem
segue os mesmos conceitos discutidos
anteriormente,
• O stream de dados da conexão após lido
deve ser convertido em uma instancia do
objeto image,
• Este objeto então ser utilizado pela
aplicação.
Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 48
Recebendo uma imagem
• Exemplo:
 Recebindo uma imagem do servidor,
 Mostrando a imagem na tela.

 MIDlet Name: Recebendo uma imagem


 MIDlet Class: HTTPConnectionMIDletImage
HTTPConnectionReadImage
 Servidor: ok.jpg

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 49


O que não foi abordado
• Conexão usando o protocolo file (permite
acesso ao PIM e ao cartão de memória do
dispositivo),

• Conexão usando sockets,

• Gerenciamento de sessões HTTP (Session


ID, cookies)

Prof. Dany S. Dominguez/dany@labbi.uesc.br Tema 5 – Slide 50

Você também pode gostar