Mostrando postagens com marcador Corba. Mostrar todas as postagens
Mostrando postagens com marcador Corba. Mostrar todas as postagens
Como fazer um cliente em Java e um servidor em C++
por Anônimo c++, Corba, jacorb, Java, omniorb, ufscar
Partindo do princípio de que você instalou ambos os orb's, tanto o jacOrb (que vem junto com o JDK do Java, para instalar basta seguir este tutorial e pronto) e o omniOrb (para instalar baste seguir este outro tutorial ).
Agora para realizar a chamada entre o cliente em Java utilizando o orb jacOrb e o servidor em C++ utilizando o omniOrb, faça o seguinte :
Pegue o echo.idl que fica dentro da pasta idl, a pasta idl esta dentro da pasta aonde foi instalado o omniOrb.
Agora copie este echo.idl para uma pasta qualquer, iremos gerar os stubs/skeletons para ela:
idlj echo.idl
Ele irá gerar uma pasta chamada echo, entre nela e crie um arquivo .java, EchoClient.java (ele que fará o papel do nosso cliente Java) e cole o seguinte código :
EchoClient.java
Cole o código acima no arquivo criado, EchoClient.java, salve e feche.
Agora compile todos os .java que tive na pasta :
javac *.java
Agora uma coisa importante, é necessário alterar um valor no arquivo omniORB.cfg que utilizamos para instalar o omniOrb, lembram ?
Pois bem, acesse o arquivo como root para poder alterar :
no Ubuntu:
sudo gedit.omniORB.cfg
Fedora :
su
gedit.omniORB.cfg
Altere supportBootstrapAgent = 0 para supportBootstrapAgent = 1 em omniORB.cfg.
Isso é necessário para poder permitir a interoperabilidade entre os orb's, tudo bem ?
Agora digite
make
na pasta aonde esta o exemplo da pasta echo que é subdiretório da pasta 'build' que criamos para instalar o omniOrb lembram ?
Por exemplo:
Eu instalei o omniOrb em :
/home/valter/Corba/omniOrb/install/
A pasta idl, aonde estará o echo.idl esta em :
/home/valter/Corba/omniOrb/install/omniORB-4.1.4/idl/
A pasta build estará em :
/home/valter/Corba/omniOrb/install/build
Os arquivos de exemplo que utilizamos serão compilados na pasta :
/home/valter/Corba/omniOrb/install/omniORB-4.1.4/build/src/examples/echo/ (dê o 'make' aqui)
O código fonte esta em :
/home/valter/Corba/omniOrb/install/omniORB-4.1.4/src/examples/echo
A separação de código fonte e arquivos compilados se dá porque utilizamos a instalação automático do omniOrb para o linux, então o arquivo que há em /home/valter/Corba/omniOrb/install/omniORB-4.1.4/build/src/examples/echo/ irá rodar os arquivos que foram configurados baseados na arquitetura do computador.
Agora inicialize o serviço de nomes do omniOrb
omniNames -start
Isso fará com que ele esteja recebendo e enviando pela porta padrão 2809
Inicialize o servidor
Entre na pasta aonde foi digitado o 'make' :
./eg3_impl
Agora inicialize o cliente :
java EchoClient -ORBInitialPort 2809
Deverá ter uma saída assim :
Começando o processo do cliente:
UFSCAR
Lembrando que o servidor só retorna a mensagem que foi enviada pelo cliente.
É isso.
Agora para que o servidor gere uma string que seja um código você deve implementar esse código no arquivo :
eg3_impl.cc que fica em :
/home/valter/Corba/omniOrb/install/omniORB-4.1.4/src/examples/echo (no meu caso)
Procure pelo método
char* Echo_i::echoString(const char* mesg)
Dentro dele construa a sua implementação de geração do código único e converta para que seja do tipo char*, que ele irá retornar para o cliente Java, tudo bem ?
É isso pessoal, espero ter ajudado.
Um forte abraço.
Valeu Gustavo pela ajuda!
Agora para realizar a chamada entre o cliente em Java utilizando o orb jacOrb e o servidor em C++ utilizando o omniOrb, faça o seguinte :
Pegue o echo.idl que fica dentro da pasta idl, a pasta idl esta dentro da pasta aonde foi instalado o omniOrb.
Agora copie este echo.idl para uma pasta qualquer, iremos gerar os stubs/skeletons para ela:
idlj echo.idl
Ele irá gerar uma pasta chamada echo, entre nela e crie um arquivo .java, EchoClient.java (ele que fará o papel do nosso cliente Java) e cole o seguinte código :
EchoClient.java
import org.omg.CosNaming.*;
import org.omg.CORBA.*;
public class EchoClient {
public static void main(String args[]) {
try {
String SetInfo, ReturnInfo, ref;
org.omg.CORBA.Object objRef;
Echo EchoRef;
ORB orb = ORB.init(args, null);
objRef = orb.resolve_initial_references("NameService");
NamingContext ncRef = NamingContextHelper.narrow(objRef);
// locate the service
NameComponent nc = new NameComponent("test", "my_context");
NameComponent nc2 = new NameComponent("Echo", "Object");
NameComponent path[] = { nc,nc2 };
EchoRef = EchoHelper.narrow(ncRef.resolve(path));
if (args.length > 1) {
SetInfo = args[1];
} else {
}
System.out.println("Começando o processo do cliente: ");
ReturnInfo = EchoRef.echoString("UFSCAR");
System.out.println(ReturnInfo);
} catch (Exception e) {
System.out.println("ERROR : " + e);
}
}
}
Cole o código acima no arquivo criado, EchoClient.java, salve e feche.
Agora compile todos os .java que tive na pasta :
javac *.java
Agora uma coisa importante, é necessário alterar um valor no arquivo omniORB.cfg que utilizamos para instalar o omniOrb, lembram ?
Pois bem, acesse o arquivo como root para poder alterar :
no Ubuntu:
sudo gedit
Fedora :
su
gedit
Altere supportBootstrapAgent = 0 para supportBootstrapAgent = 1 em omniORB.cfg.
Isso é necessário para poder permitir a interoperabilidade entre os orb's, tudo bem ?
Agora digite
make
na pasta aonde esta o exemplo da pasta echo que é subdiretório da pasta 'build' que criamos para instalar o omniOrb lembram ?
Por exemplo:
Eu instalei o omniOrb em :
/home/valter/Corba/omniOrb/install/
A pasta idl, aonde estará o echo.idl esta em :
/home/valter/Corba/omniOrb/install/omniORB-4.1.4/idl/
A pasta build estará em :
/home/valter/Corba/omniOrb/install/build
Os arquivos de exemplo que utilizamos serão compilados na pasta :
/home/valter/Corba/omniOrb/install/omniORB-4.1.4/build/src/examples/echo/ (dê o 'make' aqui)
O código fonte esta em :
/home/valter/Corba/omniOrb/install/omniORB-4.1.4/src/examples/echo
A separação de código fonte e arquivos compilados se dá porque utilizamos a instalação automático do omniOrb para o linux, então o arquivo que há em /home/valter/Corba/omniOrb/install/omniORB-4.1.4/build/src/examples/echo/ irá rodar os arquivos que foram configurados baseados na arquitetura do computador.
Agora inicialize o serviço de nomes do omniOrb
omniNames -start
Isso fará com que ele esteja recebendo e enviando pela porta padrão 2809
Inicialize o servidor
Entre na pasta aonde foi digitado o 'make' :
./eg3_impl
Agora inicialize o cliente :
java EchoClient -ORBInitialPort 2809
Deverá ter uma saída assim :
Começando o processo do cliente:
UFSCAR
Lembrando que o servidor só retorna a mensagem que foi enviada pelo cliente.
É isso.
Agora para que o servidor gere uma string que seja um código você deve implementar esse código no arquivo :
eg3_impl.cc que fica em :
/home/valter/Corba/omniOrb/install/omniORB-4.1.4/src/examples/echo (no meu caso)
Procure pelo método
char* Echo_i::echoString(const char* mesg)
Dentro dele construa a sua implementação de geração do código único e converta para que seja do tipo char*, que ele irá retornar para o cliente Java, tudo bem ?
É isso pessoal, espero ter ajudado.
Um forte abraço.
Valeu Gustavo pela ajuda!
Como fazer comunicação cliente/servidor em Java usando Corba
por Anônimo Corba, distribuido, Java, sistema
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
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
servidor.java
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
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.
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
Espero que ajude,
um forte abraço.
