Para este tutorial é necessario ter a JDK da Sun no seu Windows, Linux, eu fiz um tutorial ensinando como instalar a JDK no linux, que pode ser visto
aqui.
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.