Demo Blog
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 , , , , ,

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
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 .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!
1 comentários mais...

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

por Anônimo , , ,

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.
1 comentários mais...

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