Conexão Socket na MIDP



Documentos relacionados
CONECTIVIDADE. Desenvolvimento de Sistemas WEb Computação Móvel

Capítulo II Modelos de Programação Distribuída

Java : Comunicação Cliente-Servidor.

Olho por olho, e o mundo acabará cego. Mohandas Gandhi

Programação para Celular com Java

INF1013 MODELAGEM DE SOFTWARE

Prática de Programação J2ME (15) Especialização em Desenvolvimento Web com Interfaces Ricas

Sintaxe Geral Tipos de Dados. Prof. Angelo Augusto Frozza, M.Sc.

insfcanceof new public switch transient while byte continue extends for int null

Multithreading. Programação Orientada por Objectos com Java. Ademar Aguiar. MRSC - Programação em Comunicações

Exercícios de Revisão Java Básico

Aula 30 - Sockets em Java

Programação com sockets (em Java)

Sockets em Java. Leonardo R. Nunes - leonardo@sumersoft.com. 1. Introdução. 2. Sockets TCP/IP

Threads e Sockets em Java. Threads em Java. Programas e Processos

Uma Introdução ao. Computação Móvel (MAC5743/MAC330) Prof. Alfredo Goldman Monitores: Rodrigo Barbosa Daniel Cordeiro

Orientação a Objetos

Um pouco do Java. Prof. Eduardo

Programação Paralela e Distribuída. Prof. Cidcley T. de Souza

Java ME e suas principais tecnologias de conectividade. Gracieli Begia Mateus

Descrição. Implementação. Departamento de Informática e Estatística Universidade Federal de Santa Catarina LAB 4 Transferência de Arquivos

Tutorial J2ME Parte 3

FINAL: CÓDIGO-FONTE DA MIDLET

Programação em Rede Baseada em Java. Luiz Affonso Guedes Tópicos em Redes de Computadores Programação Distribuída

Java 2 Standard Edition Fundamentos de

Programação Orientada a Objectos - P. Prata, P. Fazendeiro. Cartão de fidelização de clientes das distribuidoras de combustível.

Sockets com Java Parte I

Sockets. Introdução. Introdução. Programando para redes em Java. mecanismo de alto nível para acessar recursos na Internet.

Comandos de repetição For (inicialização; condição de execução; incremento/decremento) { //Código }

Comunicação entre processos

Redes de Computadores /1

Bacharelado em Ciência e Tecnologia BC Processamento da Informação Teoria Arquivos Prof. Edson Pinheiro Pimentel edson.pimentel@ufabc.edu.

Programação para Celular com Java Tipos de Tela

THREADS EM JAVA. George Gomes Cabral

Linguagem de Programação JAVA. Técnico em Informática Professora Michelle Nery

Mecanismos de Comunicação. Sockets em java (

Analisar os sistemas operacionais apresentados na figura e responder as questões abaixo: Identificar

Cliente-servidor com Sockets TCP

FTP FILE F TRANSFER PROTOCOL. Tópicos

Programação de sockets com TCP

Comunicação via Sockets. Prof. Orlando Loques - IC/UFF. versão

Programação de Sockets

Persistência de Classes em Tabelas de Banco de Dados

Programação de Computadores - I. Profª Beatriz Profº Israel

Programação Gráfica Parte 1 Versão em Java 2006 PUCPR Tutoria de Jogos 1º Ano

Manual do Desenvolvedor Criptografia de Arquivos do WebTA

Sockets. Bruno Guimarães Lucas Rossini

Exemplo 1. Um programa que cria uma instância de uma classe que herda da classe Frame

SISTEMAS DISTRIBUÍDOS

Java Básico. Matrícula de Alunos. Marco Antonio, Arquiteto de Software TJDF Novembro/2005

Programação: Sockets em Java

A ) O cliente terá que implementar uma interface remota. . Definir a interface remota com os métodos que poderão ser acedidos remotamente

Sistemas Distribuídos Java Sockets

Programação Concorrente em Java. Profa Andréa Schwertner Charão DLSC/CT/UFSM

socket Objetivo: aprender a construir aplicações cliente/servidor que se comunicam usando sockets

Programação Na Web. Servlets: Como usar as Servlets. Agenda. Template genérico para criar Servlets Servlet 2.4 API

Java Threads. Introdução

INSTALAÇÃO E USO DO GOOGLE APP ENGINE PLUGIN utilizando o Eclipse Galileo

PHP (PHP Hypertext Preprocessor)

Prova de Java. 1) Copie o programa abaixo no eclipse e complete-o, utilizando os conceitos aprendidos durante o curso. (4 pontos)

Desenvolvimento de Sistemas Móveis em Java com J2ME/MIDP. Jorge H. C. Fernandes

Filas. Fabrício J. Barth. BandTec - Faculdade de Tecnologia Bandeirantes

Curso Adonai QUESTÕES Disciplina Linguagem JAVA

LINGUAGEM ORIENTADA A OBJETOS

Programação Orientada a Objetos em Java. Threads Threads Threads. Threads

GUIA DE INTEGRAÇÃO APP2APP APLICATIVO PAGSEGURO 1. Guia de Integração App2App Aplicativo PagSeguro VERSÃO 1.0.0

Tutorial RMI (Remote Method Invocation) por Alabê Duarte

Universidade da Beira Interior. Sistemas Distribuídos

Aula 2. Objetivos. Encapsulamento na linguagem Java; Utilizando a referência this.

Exercício 1 : As classes abaixo serão utilizadas neste exercício: public class Ponto { int x; int y; public Ponto(int x, int y){ this.

Sistemas Distribuídos

Java 2 Micro Edition (J2ME)

Hacking Class Controlando tomadas da sua casa via Internet

Arduino e Processing. Professor: Paulo Marcos Trentin Escola CDI Videira

Desenvolvimento OO com Java Orientação a objetos básica

Computação II - Java Prof. Adriano Joaquim de Oliveira Cruz Aula Prática - Herança, Polimorfismo e Construtores

Aula 3 Desvio Condicional

JavaScript (ou JScript)

Programação Orientada a Objetos II

Programação de Sockets

Implementando comunicação em JAVA via Sockets. Alcides Calsavara - alcides@ppgia.pucpr.br Leonardo R. Nunes - leonardo@sumersoft.

Prototype, um Design Patterns de Criação

Uma Introdução à Arquitetura CORBA. O Object Request Broker (ORB)

O programa abaixo exemplifica o uso da classe Image para carregar e mostrar uma imagem localizada em um arquivo.

CURSO DE PROGRAMAÇÃO EM JAVA

Sockets em Ruby. Curso de Tecnologia em Redes de Computadores Programação para Redes

Transcrição:

Conexão Socket na MIDP A comunicação entre diferentes sistemas é comum na programação, e esta regra não desaparece na construção de aplicativos para pequenos dispositivos e, consequentemente, com o Java ME (MIDP). Além das comunicação corriqueiras, como o HTTP (Hypertext Transfer Protocol), SMS (Short Message Service) e etc, a biblioteca da MIDP fornece novas formas de comunicações na sua nova versão, a 2.0, como a SocketConnection. Como o objetivo deste texto não é dissecar completamente a comunicação socket, descrevo o mesmo com a seguinte descrição. Socket é um ponto de comunicação, e é composto de um IP e uma porta [GURJÃO, Edmar Candeia]. Também não é objetivo deste texto se posicionar sobre os pontos positivos e negativos das várias formas de comunicação. O foco principal aqui é mostrar como efetuar uma comunicação socket usando Java ME (MIDP) para se comunicar com um servidor. Inicialmente é apresentado a estrutura de comunicação da MIDP, posteriormente é mostrada a SocketConnection e seus principais métodos, e por fim, será construído um pequeno exemplo onde o aplicativo MIDP acessa um servidor através de socket e recebe uma mensagem de boas vindas, que é definida conforme a hora atual do servidor. GCF A Generic Connection Framework é um framework criado para uso exclusivo no Java ME, isso porque as classes que são usadas nos pacotes java.io.* e java.net.* para conexões em Java SE, oferecem um conjunto muito grande de classes e interfaces, sendo assim, seu uso em pequenos dispositivos é inconcebível. Portanto, a GFC foi criada para oferecer um conjunto diminuído mas totalmente funcional para prover a maioria das formas de comunicação existenten atualmente. A figura abaixo mostra sua estrutura a partir da MIDP 2.0, visto que, as classes javax.microedition.io.socketconnection, javax.microedition.io.serversocketconnection e javax.microedition.io.udpdatagramconnection não estão disponíveis na MIDP 1.0. Generic Connection Framework. Fonte: MAHMOUD, Qusay H. Uma características marcante e inteligente da GCF é a forma de criar uma conexão, sendo que para todas os tipos usa se a mesma estrutura de código, ou seja, independe se seu código vai gerar uma conexão HTTP ou socket, a codificação seguirá a mesma lógica e as mesmas classes. Veja a Listagem 1. O ponto crucial é o uso da classe Connector e seu método open(), passando o protoclo, seu

endereço e os possíveis parâmetros. try Connector.open("protocol:address;parameters"); catch (ConnectionNotFoundExeption e).. Listagem 1 Estrutura para abrir uma conexão. Para exemplificar os conceitos apresentados anteriormente veja a Listagem 2. Neste trecho de código estão sendo criados três tipos de conexão, primeiramente uma conexão HTTP, posteriormente uma conexão socket e por fim, uma conexão por datagramas. Em todas elas usamos o mesmo método open() da classe Conector. Um conceito importante é apresentado por MAHMOUD, para este autor, o método open() é uma fábrica para novas conexões, você não usa o operador new para instanciar uma conexão. Quando um tipo específico de conexão não é implementado pelo dispositivo, a tentativa de sua criação cria uma exceção ConnectionNotFoundException. Connector.open("http://www.javafree.com.br") Connector.open("socket://www.javafree.com.br:5500") Connector.open("datagram://www.javafree.com.br:5500") Estudo de caso Listagem 2 Criação de três tipos de conexão. Como descrito no início deste texto, o estudo de caso implementa um servidor que retorna uma mensagem de saudação a aplicação MIDP, sendo Bom Dia, Boa Tarde ou Boa Noite, dependendo da hora em que o serviço rodando no servidor foi acessado. A Listagem 3 traz o código completo. /* * Server.java * * Created on 15 de Maio de 2007, 14:28 */ package home.ping; import java.io.*; import java.net.*; import java.util.*; /** * * @author ping */ public class Server /** Creates a new instance of Server */ public Server() super();

public static void main(string[] main) int server_port = 6500; ServerSocket server_socket = null; Socket socket_base = null; try server_socket = new ServerSocket(server_port); do socket_base = server_socket.accept(); InetAddress inet_connected = socket_base.getinetaddress(); System.out.println("Uma nova conexão foi estabelecida com: "+inet_connected.gethostname()+" > ip: "+inet_connected.gethostaddress()+" na porta: "+socket_base.getport()); InputStream input = socket_base.getinputstream(); int ch = input.read(); StringBuffer leu = new StringBuffer(); while (ch!= 1) leu.append((char)ch); ch = input.read(); OutputStream output = null; if (leu.tostring().trim().equals("abbced")) Calendar cal = Calendar.getInstance(); cal.settime(new Date()); int hora = cal.get(calendar.hour_of_day); output = socket_base.getoutputstream(); if (hora >= 0 && hora < 12) output.write("olá.. Bom dia".getbytes()); else if (hora >= 12 && hora < 19) output.write("olá.. Bom tarde".getbytes()); else output.write("olá.. Bom noite".getbytes()); if (output!= null) output.flush(); output.close(); while (true); catch (Exception e) System.out.println("Exception: "+e); Listagem 3 Implementação do servidor

O começo significativo do código começa no trecho de código: server_socket = new ServerSocket(server_port); Neste momento definimos que um servidor de socket estará ativo na porta passado por parâmetro para o construtor da classe ServerSocket, no exemplo definimos uma variável server_port. Posteriormente, o código entra em um loop do while, o trecho de código que segue é importante para o entendimento do restante do programa: socket_base = server_socket.accept(); InetAddress inet_connected = socket_base.getinetaddress(); System.out.println("Uma nova conexão foi estabelecida com: "+inet_connected.gethostname()+" > ip: "+inet_connected.gethostaddress()+" na porta: "+socket_base.getport()); Quando uma nova requisição de comunicação socket chega neste servidor, o método accept() da classe ServerSocket é chamado, permitindo a comunicação com o servidor. A seguir, recupera se as informações referentes ao ponto que está se comunicando com o servidor, através da classe InetAddress. A linha seguinte somente mostra estas informações. Depois de ter aceitado que uma nova comunicação se efetue, o próximo passo é receber as informações que estão sendo passadas pela porta que foi definida na inicialização do ServerSocket. InputStream input = socket_base.getinputstream(); int ch = input.read(); StringBuffer leu = new StringBuffer(); while (ch!= 1) leu.append((char)ch); ch = input.read(); OutputStream output = null; if (leu.tostring().trim().equals("abbced")) Inicialmente cria se um InputStream para começar a receber os dados oriundos da conexão. Em seguida criamos um laço while que lerá todos os bytes recebidos até chegar ao final do InputStream, quando encontrara o valor 1. Neste momento é verificado se o conjunto de dados recebidos forma a String abbced, que foi apenas um protocolo criado para saber que quem está acessando o servidor é a aplicação MIDP que foi construída com o intuito específico de se comunicar com o servidor de socket criado. Passando pelo teste o que nos resta é enviar a saudação para a aplicação que estará residente no dispositivo móvel. Calendar cal = Calendar.getInstance(); cal.settime(new Date()); int hora = cal.get(calendar.hour_of_day); output = socket_base.getoutputstream(); if (hora >= 0 && hora < 12) output.write("olá.. Bom dia".getbytes()); else if (hora >= 12 && hora < 19) output.write("olá.. Bom tarde".getbytes()); else output.write("olá.. Bom noite".getbytes()); Da mesma forma que foi criado um InputStream para receber os dados, cria se um OutputStream para retornar alguma informação pela conexão socket. O restante de código apenas pega a hora atual, verifica esta informação e escreve a informações correta na saída do nosso servidor, através do

método write(byte[]). O código responsável pela comunicação da MIDP ao nosso servidor é mostrado na Listagem 4. import java.io.ioexception; import java.io.inputstream; import java.io.outputstream; import javax.microedition.io.connector; import javax.microedition.io.socketconnection; import javax.microedition.midlet.*; import javax.microedition.lcdui.*; /** * * @author ping * @version */ public class UsandoSocket extends MIDlet implements CommandListener, Runnable private Display display; private Form fmmain; private Command cmconectar; private SocketConnection sc; private InputStream is; public void startapp() display = Display.getDisplay(this); fmmain = new Form("Using Sockets:"); cmconectar = new Command("Conectar", Command.ITEM, 1); fmmain.addcommand(cmconectar); fmmain.setcommandlistener(this); display.setcurrent(fmmain); public void pauseapp() public void destroyapp(boolean unconditional) public void commandaction(command c, Displayable d) Thread t = new Thread(this); t.start(); public void run() try SocketConnection sc = (SocketConnection) Connector.open("socket://localhost:6500"); OutputStream os = sc.openoutputstream(); os.write("abbced".getbytes()); os.flush(); os.close(); StringBuffer sb = new StringBuffer(); is = sc.openinputstream(); int c = is.read(); while (c!= 1) sb.append((char)c); c = is.read();

fmmain.append(sb.tostring()); catch(ioexception e) System.out.println("erro: "+e); finally try if(is!= null) is.close(); if(sc!= null) sc.close(); catch(ioexception e) e.printstacktrace(); O código pertencente ao Java ME será ignorado, presupondo que o leitor tenha conhecimento. A parte realmente importante do código é listada abaixo: SocketConnection sc = (SocketConnection) Connector.open("socket://localhost:6500"); OutputStream os = sc.openoutputstream(); os.write("abbced".getbytes()); os.flush(); os.close(); StringBuffer sb = new StringBuffer(); is = sc.openinputstream(); int c = is.read(); while (c!= 1) sb.append((char)c); c = is.read(); fmmain.append(sb.tostring()); NO trecho de código acima é criada uma conexão socket para um servidor local, acessando a porta 6500. Posteriormente, uma String contendo o nosso protocolo de verificação é enviado através da classe OutputStream, de maneira análoga, a classe InputStream é usada para receber os dados que o servidor retornou, inserindo esta informações na instãncia de nossa classe Form. Conclusão A conexão através de sockets foi adicionada na MIDP 2.0 e pode ser uma excelente alternativa em alguns casos, também, é importante que você tenha conhecimento desta possibilidade, adicionando novas possibilidades na construção de seus aplicativos Java ME. O objetivo deste texto foi mostrar de forma sucinta e rápida como criar, enviar e receber dados de uma aplicação Java ME, também mostrou a implementação no lado do servidor, não entrando em detalhes específicos da comunicação via socket. Esperamos que a síntese mostrada aqui seja útil para o leitor. Discuta sobre este artigo: http://www.javafree.org/javabb/viewtopic.jbb?t=855636#110890 Ricardo da Silva Ogliari é formando em Ciência da Computação pela Universidade de Passo Fundo RS e mestrando como aluno especial da Universidade Federal do Rio Grande do Sul. Desenvolveu sistemas mobile para empresas do Rio Grande do Sul, atualmente trabalha como desenvolvedor de

aplicações direcionadas a telefones celulares na Kwead.com de São Paulo. Também, foi palestrante dos eventos JustJava 2005 e EJES (Encontro Java do Espírito Santo) 2005, além de ministrar alguns cursos sobre a tecnologia Java ME. Referências Bibliográficas GURJÃO, Edmar Candeia. Programação com Socket usando DEV C++. Universidade Federal de Campina Grande. MAHMOUD, Qusay H. (2003). J2ME Low Level Network Programming with MIDP 2.0.