Demo Blog

Como fazer comunicação cliente/servidor em Java usando Corba

por Anônimo

Aula do professor Frank Siqueira que pode ser visualizada aqui.

Arquivos utilizados no tutorial :
Servidor.java
Cliente.java
Banco.idl
Auto_AtendimentoImpl.java

Descrição
Essa atividade mostrará como utilizar o CORBA para efetuar a comunicação entre objetos distribuídos.

Roteiro
Especificando a Interface do Servidor

Suponha a interface do servidor de um banco, que deve ser acessado tanto pelo sistema de auto-atendimento pela Internet quanto pelos caixas eletrônicos.

Primeiramente, devemos definir a interface IDL do servidor. Iremos utilizar a seguinte interface:

Banco.idl
module banco {

  typedef unsigned long conta; 
  typedef double valor; 

  const string nome_banco = "UFSC";
  const string moeda = "R$"; 

  enum aplicacao { poupanca, fundo_acoes, renda_fixa };

  struct transacao { 
    unsigned long data; // Formato: ddmmyyyy
    string<12>    descricao; 
    valor         quantia; 
  };

  typedef sequence  transacoes; 
  exception conta_inval { conta c; };
  exception saldo_insuf { valor saldo; };

  interface auto_atendimento {
    readonly attribute string boas_vindas;
    valor saldo ( in conta c ) 
          raises ( conta_inval );

    void extrato ( in conta c, out transacoes t, out valor saldo ) 
         raises ( conta_inval );  

    void transferencia ( in conta origem, in conta destino, in valor v )
         raises ( conta_inval, saldo_insuf );  

    void investimento ( in conta c, 
         in aplicacao apl, in valor v ) 
         raises ( conta_inval, saldo_insuf ); 

  };

  interface caixa_eletronico: auto_atendimento {
    void saque ( in conta c, in valor v ) 
         raises ( conta_inval, saldo_insuf );

  }; 

};


Salve a descrição de interface acima no arquivo Banco.idl e a compile com o comando:

idlj -fall Banco.idl

Note que foram gerados diversos arquivos no diretório banco, dentre os quais estão as stubs e skeletons que serão usados pela aplicação e classes que correspondem aos tipos de dados e exceções definidos no arquivo IDL.
Implementando o código do Servidor

Agora devemos implementar o servidor. O arquivo auto_atendimentoImpl.java contém uma implementação limitada dos métodos especificados na interface de auto-atendimento. O arquivo servidor.java contém o código necessário para instanciar o servidor e registrá-lo no serviço de nomes. Salve estes dois arquivos no diretório banco criado pelo compilador IDL.

atendimentoImpl.java
package banco;



import org.omg.CosNaming.*;

import org.omg.CORBA.*;



class auto_atendimentoImpl extends auto_atendimentoPOA

{  

  public String boas_vindas () { return "Bem-vindo ao banco " + banco.nome_banco.value; };

  public double saldo (int c) throws banco.conta_inval { return 0.0; }

  public void extrato (int c, banco.transacoesHolder t, org.omg.CORBA.DoubleHolder saldo) throws banco.conta_inval {}

  public void transferencia (int origem, int destino, double v) throws banco.conta_inval, banco.saldo_insuf {}

  public void investimento (int c, banco.aplicacao apl, double v) throws banco.conta_inval, banco.saldo_insuf {}

}

servidor.java
package banco;



import org.omg.CosNaming.*;

import org.omg.CORBA.*;

import org.omg.PortableServer.*;

import java.io.*;



public class servidor

{

  public static void main(String args[]) {

    try{

      // Cria e inicializa o ORB

      ORB orb = ORB.init(args, null);



      // Cria a implementação e registra no ORB

      auto_atendimentoImpl impl = new auto_atendimentoImpl();



      // Ativa o POA

      POA rootpoa = POAHelper.narrow(

        orb.resolve_initial_references("RootPOA"));

      rootpoa.the_POAManager().activate();



      // Pega a referência do servidor

      org.omg.CORBA.Object ref = 

        rootpoa.servant_to_reference(impl);

      auto_atendimento href = auto_atendimentoHelper.narrow(ref);

   

      // Obtém uma referência para o servidor de nomes

      org.omg.CORBA.Object objRef = 

        orb.resolve_initial_references("NameService");

      NamingContextExt ncRef = 

        NamingContextExtHelper.narrow(objRef);



      // Registra o servidor no servico de nomes

      String name = "AutoAtendimento";

      NameComponent path[] = ncRef.to_name( name );

      ncRef.rebind(path, href);



      System.out.println("Servidor aguardando requisicoes ....");



      // Aguarda chamadas dos clientes

      orb.run();

    } catch (Exception e) {

        System.err.println("ERRO: " + e);

        e.printStackTrace(System.out);

    }

    System.out.println("Encerrando o Servidor.");

  }

}

Compile todos os arquivos do servidor com o comando:

javac banco/*.java


Implementando o código do Cliente

O cliente CORBA (arquivo cliente.java) localiza o servidor e faz chamadas aos seus métodos.

cliente.java
import banco.*;

import org.omg.CORBA.*;

import org.omg.CosNaming.*;

import org.omg.CosNaming.NamingContextPackage.*;



public class cliente {



  public static void main(String args[]) {

    try {

      // Cria e inicializa o ORB

      ORB orb = ORB.init(args, null);



      // Obtem referencia para o servico de nomes

      org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");

      NamingContextExt ncRef = 

        NamingContextExtHelper.narrow(objRef);

 

      // Obtem referencia para o servidor

      String name = "AutoAtendimento";

      auto_atendimento server = auto_atendimentoHelper.narrow(ncRef.resolve_str(name));



      // Imprime mensagem de boas-vindas

      System.out.println(server.boas_vindas());



      // Obtem o numero da conta

      System.out.print("Entre o numero da sua conta: ");

      java.io.BufferedReader reader = new java.io.BufferedReader(new java.io.InputStreamReader(System.in));

      String conta = reader.readLine();



      // Imprime o saldo atual

      System.out.println("Seu saldo eh de R$" + server.saldo(Integer.parseInt(conta)));



    } catch (Exception e) {

        System.out.println("ERROR : " + e) ;

        e.printStackTrace(System.out);

    }

  }

}



Compile o cliente com o comando:

javac cliente.java

Executando a Aplicação no Windows

Primeiramente, inicie o ORB com o comando:

> start orbd

Em seguida, inicie o servidor:

> start java banco.servidor

Finalmente, inicie o cliente com o comando:

> java cliente

Para fazer a comunicação entre máquinas diferentes, indique ao cliente que o ORB estará rodando em outro computador:

> java cliente -ORBInitialHost

Obs.: as restrições de segurança impostas na rede do laboratório não permitem essa forma de comunicação entre máquinas.
Executando a Aplicação no Linux

Primeiramente, inicie o ORB com o comando:

> orbd -ORBInitialPort 2500 &

Em seguida, inicie o servidor em um terminal:

> java banco.servidor -ORBInitialPort 2500

Finalmente, inicie o cliente executando em outro terminal o comando:

> java cliente -ORBInitialPort 2500

Para fazer a comunicação entre máquinas diferentes, indique ao cliente que o ORB estará rodando em outro computador:

> java cliente -ORBInitialHost -ORBInitialPort 2500


Espero que ajude,
um forte abraço.
1 comentários mais...

1 comentários

Postar um comentário

Procura algo?

Busque aqui para achar algo no site:

Caso não tenha achado o que procurava, me envie um email para que eu possa cuidar disso para você.

Paperblog :Os melhores artigos dos blogs