Baixe o app para aproveitar ainda mais
Prévia do material em texto
PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS Aula 10- Comunicação Remota CONSTRUÇÃO DE UM JOGO SIMPLES – AULA7 PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS Conteúdo Programático desta aula Aprender como realizar a comunicação remota com servidores via HTTP; CONSTRUÇÃO DE UM JOGO SIMPLES – AULA7 PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS O FRAMEWORK GENÉRICO DE CONEXÃO •Apesar das bibliotecas da plataforma Java Standard Edition para conectividade a rede possuírem recursos eficientes, devido as características limitadas de hardware, um dispositivo móvel poderia não suportar a quantidade de classes e interfaces presentes nos pacotes java.net e java.io e, por este motivo, esses pacotes foram simplificados e um framework genérico de conexão, também conhecido por GCF (Generic Connection Framework), foi desenvolvido para tratar assuntos de i/o (entrada e saída de dados) e conectividade. CONSTRUÇÃO DE UM JOGO SIMPLES – AULA7 PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS O FRAMEWORK GENÉRICO DE CONEXÃO •O GCF não tinha por objeto ser um novo conjunto de classes, mas sim proporcionar um subconjunto do JSE (Java Standard Edition) que estivesse em sintonia com as limitações e as variações que possam ser encontradas em dispositivos de aplicação MIDP, todavia, atualmente, você encontra o GCF não somente em dispositivos baseados em CLDC, como os que utilizam MIDP (Mobile Information Device Profile) e IMP (Information Module Profile), mas também em dispositivos que usam CDC (Connected Device Configuration). •Indo além, devido à padronização do uso, você também pode encontrar o GCF em um número crescente de pacotes opcionais, incluindo aqueles que proveem acesso a arquivos, suporte a Bluetooth e smart cards. CONSTRUÇÃO DE UM JOGO SIMPLES – AULA7 PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS ESTRUTURA DO FRAMEWORK GENÉRICO DE CONEXÃO (GCF) •GCF possui uma estrutura simplificada de interfaces e classes para executar fluxos de entrada e saída de dados, seja para arquivos ou conexões (como HTTP, datagramas e soquetes). •GCF provê uma abordagem genérica para conectividade •provê um conjunto de APIs comuns para todos os tipos básicos de conectividade, seja para pacotes (blocos de dados) e para fluxos de entrada e saída (contínuos ou não). •A generalização é possível através da utilização de: •Uma interface hierárquica que pode ser estendida; •Uma fábrica de conexão; •Pela padronização da URL para indicar o tipo apropriado de conexão a ser criado. •Embora cada tipo de conexão tenha suas particularidades, para usar o GCF é muito simples, basta utilizar a classe Connector e uma URL para criar uma conexão. A classe Connector cria e abre o tipo de conexão apropriado de acordo com a URL que você especificar, desde que a URL seja suportada. CONSTRUÇÃO DE UM JOGO SIMPLES – AULA7 PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS Hierarquia da Generic Connection Framework Interface CONSTRUÇÃO DE UM JOGO SIMPLES – AULA7 PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS Criando uma conexão – Connection.open import java.io.IOException; import java.io.InputStream; import javax.microedition.io.ConnectionNotFoundException; import javax.microedition.io.Connector; import javax.microedition.io.SocketConnection; public class Conexao { public void exemplo() { String url = "socket://portal.estacio.br:80"; SocketConnection c = null; InputStream s = null; try { c = (SocketConnection)Connector.open(url); s = c.openInputStream(); // Ler e manipular o fluxo de entrada. // ... } catch (ConnectionNotFoundException cne) { // Ocorre se a conexão especificada não puder ser criada. Tratar o erro. } catch (IllegalArgumentException iae) { // Ocorre se um dos argumentos estiver errado. // Neste exemplo, o único argumento a ser aberto é a URL, // assim os únicos erros possíveis são ConnectionNotFoundException // ou IOException. Tratar erro. } catch (IOException ioex) { // Tratar erro. } finally { try { if (null != s) { s.close(); } if (null != c) { c.close(); } } catch (Exception ex) { // Tratar erro. } } } } CONSTRUÇÃO DE UM JOGO SIMPLES – AULA7 PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS Abrindo uma Conexão O GCF suporta um grande número de tipos de conexões e as URLs são importantes para definir as regras da conexão, descrevendo a localização e o meio de acesso ao recurso desejado. O formato geral de uma URL, como definido na RFC 1738 (e depois na RFC 2396), é o seguinte: scheme://user:password@host:port/url-path;parameters , onde: scheme especifica o método ou o protocolo e define o tipo de conexão a ser usada; user é opcional e especifica uma conta (nome de usuário); password é opcional e especifica uma senha para uma conta; host é o local, nome ou o endereço IP a quem se destina a conexão; port é opcional e depende do esquema. Especifica a porta a ser utilizada na conexão; url-path é o caminho até o recurso, depende do esquema e pode possuir parâmetros. CONSTRUÇÃO DE UM JOGO SIMPLES – AULA7 PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS Abrindo uma Conexão - Observações Note que os delimitadores são requeridos em conformidade com cada parte do formato da URL e que os parâmetros opcionais devem contê-los quando estiverem presentes. Segue um exemplo de URL com parte dos parâmetros opcionais e respectivos delimitadores: ftp://aluno:senha@portal.estacio.br/arquivos Na API do GCF, a classe Connector define três modos para abrir a conexão, são eles: open(String url) open(String url, int mode) open(String url, int mode, boolean timeouts) A variável url descreve a URL para onde a conexão será criada. A variável mode descreve a forma como a conexão acontece, ou seja, READ, WRITE ou READ_WRITE (modo padrão). A variável timeouts indica que você quer ser avisado acerca de timouts (InterruptedIOException), desde que a conexão permita tal notificação (o aviso, por padrão, é desativado, ou seja, falso). CONSTRUÇÃO DE UM JOGO SIMPLES – AULA7 PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS Qual Conexão usar A forma mais comumente utilizada deste método é a primeira, ou seja, open(String url): // Cria um SocketConnection e um InputStream String url = "socket://portal.estacio.br:80"; SocketConnection c = (SocketConnection)Connector.open(url); InputStream s = c.openInputStream(); CONSTRUÇÃO DE UM JOGO SIMPLES – AULA7 PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS Os métodos da classe Connector A classe Connector também possui alguns métodos de conveniência para criação de vários tipos de fluxo de entrada e saída: •static DataInputStream openDataInputStream(String name) •static DataOutputStream openDataOutputStream(String name) •static InputStream openInputStream(String name) •static OutputStream openOutputStream(String name) Como esses métodos são estáticos, você consegue utilizar os objetos de fluxo de entrada e saída diretamente. // Create an InputStream String url = "socket://portal.estacio.br:80"; InputStream s = (InputConnection)Connector.openInputStream(url); CONSTRUÇÃO DE UM JOGO SIMPLES – AULA7 PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS Exemplos de conexões – classe Connector Criando uma conexão via soquete (SocketConnection): String url = "socket://portal.estacio.br:80"; SocketConnection c = (SocketConnection)Connector.open(url); Criando uma conexão via HTTP (HttpConnection):String url = "http://portal.estacio.br/portal"; HttpConnection c = (HttpConnection)Connector.open(url); Criando uma conexão a um arquivo de recurso (Foundation Profile e J2SE): String url = "file:///myResourceFile.res"; InputConnection c = (InputConnection)Connector.open(url); Criando uma conexão a um arquivo de recurso (FileConnection) (JSR 75): String url = "file:///myResourceFile.res"; FileConnection c = (FileConnection)Connector.open(url); Criando uma conexão via Datagrama UDP (DatagramConnection): String url = "datagram://portal.estacio.br:12345"; UDPDatagramConnection c = (UDPDatagramConnection)Connector.open(url); CONSTRUÇÃO DE UM JOGO SIMPLES – AULA7 PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS Os Scheme definidos pela JCP URL (scheme): Req. Conectividade: Tipo de con. GCF: btl2cap Não Bluetooth L2CAPConnection datagram Não Datagrama DatagramConnection File Não Acesso a arquivo FileConnection, InputConnection http Sim HyperText Transport Protocol HttpConnection https Sim Secure HyperText Transport Protocol HttpsConnection comm Não Serial I/O (Entrada e saída serial) CommConnection sms Não Short Messaging Service MessageConnection mms Não Multimedia Messaging Service cbs Não Cell Broadcast SMS apdu jcrmi Não Security Element (segurança) APDUConnection, JavaCardRMIConnection socket serversocket Não Socket (soquete) SocketConnection, ServerSocketConnection datagram Não UDP Datagram (Datagrama UDP) UDPDatagramConnection CONSTRUÇÃO DE UM JOGO SIMPLES – AULA7 PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS Fechando uma conexão Para fechar uma conexão basta chamar o método close. No exemplo a seguir, assumindo que você tenha uma conexão em uma variável de nome c, faríamos o seguinte: try { if (null != c) { c.close(); c = null; } } catch (IOException ioex) { // Tratar ou ignorar o erro. } CONSTRUÇÃO DE UM JOGO SIMPLES – AULA7 PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS Enviando e recebendo dados por uma conexão o método baixarConteudo possui uma variável de objeto chamada is (InputStream) que é a responsável pela recepção dos dados do servidor, pois através da referência de conexão (is = c.openInputStream()) com o servidor é criado o vínculo que recebe os dados. Por fim, o método processarRespostaServidor transfere os dados recebidos para a variável conteudo quando a resposta do servidor for HTTP_OK: CONSTRUÇÃO DE UM JOGO SIMPLES – AULA7 PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS Enviando e recebendo dados por uma conexão public String baixarConteudo() throws IOException { HttpConnection c = null; InputStream is = null; OutputStream os = null; int codigoRetorno = 0; String _url = this.url; boolean permitirLoop = false; CONSTRUÇÃO DE UM JOGO SIMPLES – AULA7 PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS Enviando e recebendo dados por uma conexão do { permitirLoop = !permitirLoop; this.conteudo.delete(0, this.conteudo.length()); try { switch (this.modoEnvio) { case GET: StringBuffer urlParam = new StringBuffer(); urlParam.append(_url); if (null != this.parametros) { urlParam.append("?"); urlParam.append(this.parametros); } c = (HttpConnection)Connector.open(urlParam.toString()); c.setRequestMethod(HttpConnection.GET); break; CONSTRUÇÃO DE UM JOGO SIMPLES – AULA7 PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS Enviando e recebendo dados por uma conexão case POST: default: c = (HttpConnection) Connector.open(_url); c.setRequestMethod(HttpConnection.POST); c.setRequestProperty("Content-Type", "application/x-www-form-urlencoded"); // c.setRequestProperty("Connection", "close"); String params = this.parametros; if ((null != params) && (0 < params.length())) { os = c.openOutputStream(); os.write(params.getBytes()); // os.flush(); } } is = c.openInputStream(); codigoRetorno = this.processarRespostaServidor(c, is); _url = c.getHeaderField("Location"); } CONSTRUÇÃO DE UM JOGO SIMPLES – AULA7 PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS Enviando e recebendo dados por uma conexão finally { try { if (null != os) { os.close(); } } catch (Exception ex) { } try { if (null != is) { is.close(); } } catch (Exception ex) { } try { if (null != c) { c.close(); } } catch (Exception ex) { } } } while ((permitirLoop) && (300 <= codigoRetorno) && (307 >= codigoRetorno)); return this.conteudo.toString(); } CONSTRUÇÃO DE UM JOGO SIMPLES – AULA7 PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS Para testar Este código Crie um novo projeto no IDE NetBeans, depois crie uma classe chamada ConexaoHttp e copie o código para ela. Por fim, crie uma “MIDlet visual” e vá ao botão “Fluxo”, acrescente um objeto de “Alerta” (Alert) e inclua um “menu OK” (Command) que acione a seguinte codificação: ConexaoHttp conexaoHttp = new ConexaoHttp(this.urlSiteTextField.getString()); try { conexaoHttp.setParametros("nome=Michel&idade=36", ConexaoHttp.POST); conexaoHttp.baixarConteudo(); this.getAlert().setString(conexaoHttp.getConteudoBaixado()); } catch (Exception ex) { this.getAlert().setString("Erro: " + ex.getMessage()); } switchDisplayable(getAlert(), getForm()); CONSTRUÇÃO DE UM JOGO SIMPLES – AULA7 PROGRAMAÇÃO PARA DISPOSITIVOS MÓVEIS Fim.
Compartilhar