SlideShare a Scribd company logo
1 of 10
Download to read offline
Artigo

Distribuído Programação Java com RMI e CORBA
                                                                                           Versão para Impressão



 Índice de artigos


 Qusay H. Mahmoud
 Janeiro 2002

 O Java Remote Method Invocation mecanismo (RMI) e Common Object Request Broker Architecture
 (CORBA) são os dois mais importantes e amplamente utilizados sistemas de objetos distribuídos. Cada
 sistema tem suas próprias características e limitações. Ambos estão sendo usados na indústria para várias
 aplicações que vão desde e-commerce aos cuidados de saúde. Seleção de qual desses dois mecanismos
 de distribuição de usar para um projeto é uma tarefa difícil. Este artigo apresenta uma visão geral da RMI e
 CORBA, e mais importante ainda, mostra como desenvolver uma aplicação útil para download de arquivos
 de hosts remotos. Em seguida:


    Apresenta uma breve descrição dos sistemas de objetos distribuídos
    Fornece uma visão geral de RMI e CORBA
    Dá-lhe um sabor do esforço envolvido no desenvolvimento de aplicações em RMI e CORBA
    Mostra como transferir arquivos de máquinas remotas usando RMI e CORBA
    Fornece uma breve comparação de RMI e CORBA


 O modelo cliente / servidor
 O modelo cliente / servidor é uma forma de computação distribuída em que um programa (o cliente) se
 comunica com outro programa (o servidor) com o objetivo de trocar informações. Neste modelo, o cliente eo
 servidor geralmente falam a mesma língua - um protocolo que o cliente eo servidor de entender - para que
 eles sejam capazes de se comunicar.

 Enquanto o modelo de cliente / servidor pode ser implementada de várias maneiras, ele é tipicamente feito
 usando baixo nível sockets. Usando sockets para desenvolver sistemas cliente / servidor significa que
 devemos projetar um protocolo, que é um conjunto de comandos acordadas pelo cliente e servidor através
 do qual eles serão capazes de se comunicar. Como exemplo, considere o protocolo HTTP que fornece um
 método chamado GET , que deve ser implementada por todos os servidores web e usado por clientes web
 (browsers), a fim de recuperar os documentos.

 O Modelo de Objetos Distribuído
 Um sistema baseado em objeto distribuído é uma coleção de objetos que isola os solicitantes de serviços
 (clientes) de os prestadores de serviços (servidores) por uma interface bem definida de
 encapsulamento. Em outras palavras, os clientes são isoladas a partir da implementação de serviços de
 dados como representações e de código executável. Esta é uma das principais diferenças que distinguem o
 modelo baseado em objetos distribuídos a partir do modelo cliente / servidor puro.

 No modelo baseado em objetos distribuídos, um cliente envia uma mensagem a um objeto, que por sua vez
 interpreta a mensagem para decidir que serviço a executar. Este serviço, ou método, a seleção poderia ser
 realizada por qualquer objeto ou um corretor. O Java Remote Method Invocation (RMI) e Common Object
 Request Broker Architecture (CORBA) são exemplos deste modelo.

 RMI
 RMI é um sistema de objetos distribuídos que lhe permite desenvolver facilmente aplicações distribuídas em
 Java. Desenvolvimento de aplicações distribuídas em RMI é mais simples do que desenvolver com sockets,
 pois não há necessidade de criar um protocolo, que é uma tarefa propensa a erros. Em RMI, o
 desenvolvedor tem a ilusão de chamar um método local de um arquivo de classe local, quando na verdade
 os argumentos são enviados para o destino remoto e interpretados, e os resultados são enviados de volta
 para os chamadores.
A Gênese de uma aplicação RMI
Desenvolver um aplicativo distribuído usando RMI envolve as seguintes etapas:

1.    Definir uma interface remota
2.    Implementar a interface remota
3.    Desenvolver o servidor
4.    Desenvolver um cliente
5.    Gerar Stubs e Skeletons, inicie o registro RMI, servidor e cliente

Agora, vamos examinar esses passos através do desenvolvimento de uma aplicação de transferência de
arquivo.

Exemplo: Aplicação de Transferência de Arquivos
Esta aplicação permite que um cliente transferir (ou download) qualquer tipo de arquivo (texto ou binário) de
uma máquina remota. O primeiro passo é definir uma interface remota que especifica as assinaturas dos
métodos a serem fornecidos pelo servidor e invocado pelos clientes.

Definir uma interface remota

A interface remota para o aplicativo de download de arquivo é mostrado no código de exemplo 1. A
interface FileInterface fornece um método downloadFile que leva uma String argumento (o
nome do arquivo) e retorna os dados do arquivo como um array de bytes.

Amostra de código 1: FileInterface.java


     importar java.rmi.Remote;
     java.rmi.RemoteException de importação;

     public interface FileInterface estende remoto {
        public byte [] DownloadFile (String fileName) throws
        RemoteException;
     }




Observe as seguintes características sobre o FileInterface :


     Deve ser declarada public , para que os clientes para ser capaz de carregar objetos remotos que
      implementam a interface remota.
     Deve estender a Remote interface, para cumprir a exigência para fazer o objeto a um controle remoto.
     Cada método da interface deve lançar um java.rmi.RemoteException .

Implementar a interface remota

O próximo passo é implementar a interface FileInterface . A implementação de exemplo é mostrado
na Amostra de código 2. Observe que, além de implementar a FileInterface , o FileImpl classe
está estendendo a UnicastRemoteObject . Isto indica que o FileImpl classe é usada para criar
uma única, não-replicado objecto, remoto que utiliza padrão RMI de transporte baseado em TCP para a
comunicação.

Amostra de código 2: FileImpl.java


     import java.io. *;
     importar java.rmi *.;
     importação classe java.rmi.server.UnicastRemoteObject;

     public class FileImpl estende UnicastRemoteObject
       implementa FileInterface {

        private String nome;

        público FileImpl (String s) throws RemoteException {
           super ();
           name = s;
}

          public byte [] DownloadFile (String fileName) {
             try {
                Arquivo file = new File (fileName);
                buffer de byte [] = new byte [file.length (int) ()];
                BufferedInputStream entrada = new
             BufferedInputStream (new FileInputStream (fileName));
                input.read (buffer, 0, buffer.Length);
                input.close ();
                retorno (buffer);
             } Catch (Exception e) {
                System.out.println ("FileImpl:" + e.getMessage ());
                e.printStackTrace ();
                return (null);
             }
          }
     }




Desenvolver o servidor

O terceiro passo é o de desenvolver um servidor. Há três coisas que o servidor precisa fazer:

1.       Criar uma instância do RMISecurityManager e instalá-lo
2.       Criar uma instância do objeto remoto ( FileImpl neste caso)
3.       Registre o objeto criado com o registro RMI. A implementação de exemplo é mostrado na 3 Amostra de
         código.

Amostra de código 3: FileServer.java


     import java.io. *;
     importar java.rmi *.;

     FileServer public class {
        public static void main (String argv []) {
           if (System.getSecurityManager () == null) {
              System.setSecurityManager (novo RMISecurityManager ());
           }
           try {
              FileInterface fi = new FileImpl ("FileServer");
              Naming.rebind ("/ 127.0.0.1/FileServer /", fi);
           } Catch (Exception e) {
              System.out.println ("FileServer:" + e.getMessage ());
              e.printStackTrace ();
           }
        }
     }




A declaração Naming.rebind("//127.0.0.1/FileServer", fi) assume que o registro
RMI está sendo executado o número da porta padrão, que é 1099. No entanto, se você executar o registro
RMI em um número de porta diferente, deve ser especificado nessa declaração. Por exemplo, se o registro
RMI é executado na porta 4500, então a declaração torna-se:

Naming.rebind("//127.0.0.1:4500/FileServer", fi)

Além disso, é importante notar aqui que nós assumimos o RMI Registry eo servidor estará rodando na
mesma máquina. Se não forem, então simplesmente mudar o endereço no rebind método.

Desenvolver um cliente

O passo seguinte é o de desenvolver um cliente. O cliente invoca remotamente todos os métodos
especificados na interface remota ( FileInterface ). Para isso no entanto, o cliente deve primeiro
obter uma referência para o objeto remoto a partir do registro RMI. Uma vez que uma referência é obtido,
o downloadFile método é invocado. A aplicação cliente é apresentado em 4 Amostra de código. Nesta
implementação, o cliente aceita dois argumentos na linha de comando: o primeiro é o nome do arquivo a ser
baixado eo segundo é o endereço da máquina do qual o arquivo deve ser baixado, que é a máquina que
está executando o servidor de arquivos.

Amostra de código 4: FileClient.java


   import java.io. *;
   importar java.rmi *.;

   public class {FileClient
      public static void main (String argv []) {
         if (argv.length! = 2) {
           System.out.println ("Uso: java fileName FileClient machineName");
           System.exit (0);
         }
         try {
            String nome = "/ /" + argv [1] + "FileServer /";
            FileInterface fi = Naming.lookup (FileInterface) (nome);
            byte [] = filedata fi.downloadFile (argv [0]);
            Arquivo file = new File (argv [0]);
            Saída BufferedOutputStream = new
               BufferedOutputStream (new FileOutputStream (file.getName ()));
            output.write (filedata, 0, filedata.length);
            output.flush ();
            output.close ();
         } Catch (Exception e) {
            System.err.println ("exceção FileServer:" + e.getMessage ());
            e.printStackTrace ();
         }
      }
   }




Executando o aplicativo

Para executar o aplicativo, é preciso gerar stubs e esqueletos, compilar o servidor eo cliente, inicie o registro
RMI e, finalmente, iniciar o servidor eo cliente.

Para gerar stubs e esqueletos, utilize o rmic compilador:

prompt> rmic FileImpl

Isso irá gerar dois arquivos: FileImpl_Stub.class e FileImpl_Skel.class . O stub é um
proxy do cliente e o esqueleto é um esqueleto do servidor.

O próximo passo é compilar o servidor eo cliente. Use o javac compilador para fazer isso. Note, no
entanto, se o servidor eo cliente são desenvolvidos em duas máquinas diferentes, a fim de compilar o cliente
precisar de uma cópia da interface ( FileInterface ).

Finalmente, é hora de começar o registro RMI e executar o servidor eo cliente. Para iniciar o registro RMI no
número da porta padrão, use o comando rmiregistry ou start rmiregistry no Windows. Para
iniciar o registro RMI em um número de porta diferente, fornecer o número da porta como um argumento
para o registro RMI:

prompt> rmiregistry portNumber

Uma vez que o registro RMI é executado, você pode iniciar o servidor FileServer . No entanto, desde a
RMI gestor de segurança está sendo usado no aplicativo de servidor, você precisa de uma política de
segurança para ir com ele. Aqui está uma política de segurança da amostra:

 grant {
    java.security.AllPermission permissão "", "";
 };
Nota: este é apenas um exemplo de política. Ele permite que ninguém a fazer nada. Para suas aplicações
de missão crítica, você precisa especificar as políticas de segurança mais restrição.

Agora, para iniciar o servidor precisar de uma cópia de todas as classes (incluindo stubs e esqueletos),
exceto a classe cliente ( FileClient.class ). Para iniciar o servidor use o seguinte comando,
assumindo que a política de segurança está em um arquivo chamado Policy.txt:
prompt> java -Djava.security.policy=policy.txt FileServer

Para iniciar o cliente em uma máquina diferente, você precisa de uma cópia da interface remota
( FileInterface.class ) e stub ( FileImpl_Stub.class ). Para iniciar o cliente use o
comando:

prompt> java FileClient fileName machineName

onde fileName é o arquivo a ser baixado e machineName é a máquina onde o arquivo está localizado
(a mesma máquina roda o servidor de arquivos). Se tudo der certo, em seguida, o cliente existe e é o
arquivo baixado na máquina local.



Para executar o cliente, mencionou que você precisa de uma cópia da interface e stub. Uma maneira mais
adequada de fazer isso é usar RMI carregamento dinâmico de classe. A idéia é que você não precisa de
cópias da interface e do topo. Em vez disso, eles podem ser localizados em um diretório compartilhado para
o servidor eo cliente, e sempre que um esboço ou um esqueleto é necessária, ela será baixada
automaticamente pelo carregador de classe RMI. Para fazer isso você executar o cliente, por exemplo,
usando o seguinte comando: java -
Djava.rmi.server.codebase=http://hostname/locationOfClasses
FileClient fileName machineName . Para mais informações sobre este assunto,
consulte Carregando dinâmicas de código usando RMI .



CORBA
O Common Object Request Broker Architecture (CORBA ou) é um padrão da indústria desenvolvido pelo
Object Management Group (OMG) para auxiliar na programação distribuída objetos. É importante notar que
CORBA é simplesmente uma especificação. A implementação CORBA é conhecido como um ORB (ou
Object Request Broker). Existem várias implementações de CORBA disponíveis no mercado, tais como
VisiBroker e Orbix, e outros. JavaIDL é outra aplicação que vem como um pacote de base com o JDK1.3 ou
superior.

CORBA foi projetado para ser plataforma e linguagem independente. Portanto, objetos CORBA pode ser
executado em qualquer plataforma, localizada em qualquer ponto da rede, e podem ser escritos em
qualquer língua que tem Language Interface Definition Language (IDL) mapeamentos.

Similar a RMI, objetos CORBA são especificadas com interfaces. As interfaces em CORBA, no entanto, são
especificadas em IDL. Enquanto IDL é semelhante ao C + +, é importante notar que IDL não é uma
linguagem de programação. Para uma introdução detalhada ao CORBA, consulte Programação distribuída
com Java: Capítulo 11 (Visão geral de CORBA) .

A Gênese de uma Aplicação CORBA
Há um número de passos envolvidos no desenvolvimento de aplicações CORBA. Estes são:

1.   Definir uma interface em IDL
2.   Mapa da interface IDL para Java (feito automaticamente)
3.   Implementar a interface
4.   Desenvolver o servidor
5.   Desenvolver um cliente
6.   Executar o serviço de nomes, o servidor eo cliente.

Vamos agora explicar cada passo a passos através do desenvolvimento de uma aplicação de transferência
baseado em CORBA arquivo, que é semelhante à aplicação RMI foi desenvolvido no início deste
artigo. Aqui estaremos usando o JavaIDL, que é um pacote essencial de JDK1.3 +.

Definir a interface

Ao definir uma interface CORBA, pensar sobre o tipo de operações que o servidor irá suportar. No pedido
de transferência de arquivo, o cliente irá chamar um método para baixar um arquivo. Amostra de código 5
mostra a interface para FileInterface . Data é um novo tipo introduzidos utilizando
o typedef palavra-chave. Uma sequence em IDL é semelhante a uma matriz excepto que uma
sequência não tem um tamanho fixo. Um octet é uma quantidade de 8-bits que é equivalente ao tipo
Java byte .
Note que o downloadFile método recebe um parâmetro do tipo string que é declarada in . IDL
define três de passagem de parâmetro modos: in (para a entrada do cliente para o servidor), out (para a
saída do servidor para o cliente), e inout (usado para entrada e saída).

Amostra de código 5: FileInterface.idl

 interface de FileInterface {
    Dados <octet> typedef seqüência;
    Dados DownloadFile (em string fileName);
 };
Uma vez que você terminar de definir a interface IDL, você está pronto para compilá-lo. O + JDK1.3 vem
com o idlj compilador, que é usado para definições de mapa em declarações IDL Java e declarações.

O idlj compilador aceita opções que permitem que você especifique se você deseja gerar stubs de
cliente, esqueletos de servidor, ou ambos. O -f<side> opção é usada para especificar o que
gerar. Oside pode ser client , server , ou all para stubs cliente e esqueletos de servidor. Neste
exemplo, uma vez que o aplicativo será executado em duas máquinas separadas, o -fserver opção é
utilizado no lado do servidor, e -fclient opção é usada no lado do cliente.

Agora, vamos compilar o FileInterface.idl e gerar esqueletos do lado do servidor. Usando o
comando:

prompt> idlj -fserver FileInterface.idl

Este comando gera vários arquivos, como esqueletos, suporte e classes auxiliares, e outros. Um arquivo
importante que é gerado é o _FileInterfaceImplBase , que vai ser uma subclasse da classe que
implementa a interface.

Implementar a interface

Agora, nós fornecemos uma implementação para o downloadFile método. Esta implementação é
conhecido como um servo, e como você pode ver a partir de Amostra de código 6, a
classe FileServantestende a _FileInterfaceImplBase classe para especificar que este
servo é um objeto CORBA.

Amostra de código 6: FileServant.java


     import java.io. *;

     public class extends FileServant _FileInterfaceImplBase {
        public byte [] DownloadFile (String fileName) {
           Arquivo file = new File (fileName);
           buffer de byte [] = new byte [file.length (int) ()];
           try {
              BufferedInputStream entrada = new
                 BufferedInputStream (new FileInputStream (fileName));
              input.read (buffer, 0, buffer.Length);
              input.close ();
           } Catch (Exception e) {
              System.out.println ("Erro FileServant:" + e.getMessage ());
              e.printStackTrace ();
           }
           retorno (buffer);
        }
     }




Desenvolver o servidor

O próximo passo é desenvolver o servidor CORBA. O FileServer classe, mostrado no código de
exemplo 7, implementa um servidor CORBA que faz o seguinte:

1.    Inicializa o ORB
2.    Cria um objeto FileServant
3.    Registra o objeto no CORBA Naming Service (COS Naming)
4.    Imprime uma mensagem de status
5.    Aguarda solicitações de cliente recebidas

Amostra de código 7: FileServer.java


     import java.io. *;
     importar org.omg.CosNaming *.;
     importar org.omg.CosNaming.NamingContextPackage *.;
     importar org.omg.CORBA *.;

     FileServer public class {
        public static void main (String args []) {
           try {
              / / Criar e inicializar o ORB
              ORB orb = ORB.init (args, null);
              / / Cria o servo e registrá-lo com o ORB
              Fileref FileServant FileServant = new ();
              orb.connect (fileref);
              / / Obter o contexto de nomeação de raiz
              org.omg.CORBA.Object objRef =
                 orb.resolve_initial_references ("NameService");
              NamingContext ncRef = NamingContextHelper.narrow (objRef);
              / / Vincular o objeto de referência na nomeação
              NameComponent nc = new NameComponent ("FileTransfer", "");
              NameComponent caminho [] = {nc};
              ncRef.rebind (caminho, fileref);
              System.out.println ("Servidor começou ....");
              / / Espera invocações dos clientes
              sync java.lang.Object java.lang.Object = new ();
              sincronizado (sync) {
                 sync.wait ();
              }
           } Catch (Exception e) {
              System.out.println ("ERRO:" + e.getMessage ());
              e.printStackTrace (System.out);
           }
        }
     }




Uma vez que o FileServer tem um ORB, ele pode registrar o serviço CORBA. Ele usa o serviço COS
Naming especificado pelo OMG e implementado por Java IDL para fazer o registro. Ele começa por obter
uma referência para a raiz do serviço de nomes. Isso retorna um objeto CORBA genérico. Para usá-lo como
um NamingContext objecto, ele deve ser reduzida (por outras palavras, fundido) para o seu tipo
próprio, e isto é feito utilizando a instrução:

NamingContext ncRef = NamingContextHelper.narrow(objRef);

O ncRef objeto é agora um org.omg.CosNaming.NamingContext . Você pode usá-lo para
registrar um serviço CORBA com o serviço de identificação usando o rebind método.

Desenvolver um cliente

O passo seguinte é o de desenvolver um cliente. Uma implementação é mostrado na exemplo de código
8. Uma vez que uma referência para o serviço de identificação foi obtido, pode ser utilizado para aceder ao
serviço de identificação e encontrar outros serviços (por exemplo, o FileTransfer serviço). Quando
o FileTransfer serviço for encontrado, o downloadFile método é chamado.

Amostra de código 8: FileClient


     import java.io. *;
     * import java.util.;
     importar org.omg.CosNaming *.;
     importar org.omg.CORBA *.;

     public class {FileClient
        public static void main (String argv []) {
           try {
/ / Criar e inicializar o ORB
                  ORB orb = ORB.init (argv, null);
                  / / Obter o contexto de nomeação de raiz
                  org.omg.CORBA.Object objRef =
                     orb.resolve_initial_references ("NameService");
                  NamingContext ncRef = NamingContextHelper.narrow (objRef);
                  NameComponent nc = new NameComponent ("FileTransfer", "");
                  / / Resolve o objeto de referência na nomeação
                  NameComponent caminho [] = {nc};
                  FileInterfaceOperations fileref =
                     FileInterfaceHelper.narrow (ncRef.resolve (caminho));

                  if (argv.length <1) {
                     System.out.println ("Uso: java FileClient filename");
                  }

                  / / Salvar o arquivo
                  Arquivo file = new File (argv [0]);
                  dados de byte [] = fileRef.downloadFile (argv [0]);
                  Saída BufferedOutputStream = new
                    BufferedOutputStream (new FileOutputStream (argv [0]));
                  output.write (dados, 0, data.length);
                  output.flush ();
                  output.close ();
               } Catch (Exception e) {
                  System.out.println ("Erro FileClient:" + e.getMessage ());
                  e.printStackTrace ();
               }
           }
     }




Executando o aplicativo

O passo final é executar o aplicativo. Existem várias sub-etapas envolvidas:

1.       A execução do serviço de nomes CORBA o. Isto pode ser feito usando o comando tnameserv . Por
         padrão, ele é executado na porta 900. Se você não pode executar o serviço de nomes nesta porta,
         então você pode iniciá-lo em outra porta. Para iniciá-lo na porta 2500, por exemplo, use o seguinte
         comando:

         prompt> tnameserv -ORBinitialPort 2500

2.       Iniciar o servidor. Isto pode ser feito da seguinte forma, supondo que o serviço de nomes está sendo
         executado no número de porta padrão:

         prompt> java FileServer

     Se o serviço de nomes está sendo executado em um número de porta diferente, digamos 2500, então
     você precisa especificar a porta usando o ORBInitialPort opção da seguinte forma:

     prompt> java FileServer -ORBInitialPort 2500

3.       Gerar Stubs para o cliente. Antes de executar o cliente, precisamos gerar stubs para o cliente. Para
         isso, obter uma cópia do FileInterface.idl arquivo e compilá-lo usando o compilador idlj
         especificando que você deseja gerar stubs do lado do cliente, como segue:

         prompt> idlj -fclient FileInterface.idl

4.       Execute o cliente. Agora você pode executar o cliente usando o seguinte comando, assumindo que o
         serviço de nomes é executado na porta 2500.

         prompt> java FileClient hello.txt -ORBInitialPort 2500



     Onde hello.txt é o arquivo que deseja baixar a partir do servidor.
Nota: se o serviço de nomes está sendo executado em um host diferente, então use o -
ORBInitialHost opção para especificar onde ele está sendo executado. Por exemplo, se o serviço de
nomes está sendo executado na porta de número 4500 em um host com o nome de gosling , então você
começa o cliente como se segue:

prompt> java FileClient hello.txt -ORBInitialHost gosling -
ORBInitialPort 4500


Alternativamente, essas opções podem ser especificadas no nível do código usando as
propriedades. Então, ao invés de inicializar o ORB como:

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

Ele pode ser inicializado especificando que a máquina do servidor CORBA (chamado Gosling) e número do
serviço de identificação do porta (a ser 2500) como se segue:


 Properties props = new Properties ();
 props.put ("org.omg.CORBA.ORBInitialHost", "gosling");
 props.put ("orb.omg.CORBA.ORBInitialPort", "2500");
 ORB orb = ORB.init (args, props);
Exercer
No pedido de transferência de arquivo, o cliente (em ambos os casos, RMI e CORBA) precisa saber o nome
do arquivo a ser baixado com antecedência. Não há métodos são fornecidos para listar os arquivos
disponíveis no servidor. Como um exercício, você pode querer melhorar a aplicação, adicionando um outro
método que lista os arquivos disponíveis no servidor. Além disso, em vez de usar um cliente de linha de
comando você pode querer desenvolver um cliente baseado em GUI. Quando o cliente é iniciado, ele
chama um método no servidor para obter uma lista de arquivos, em seguida aparece um menu contendo os
arquivos disponíveis onde o usuário seria capaz de selecionar um ou mais arquivos a serem baixados, como
mostrado na Figura 1.




                            Figura 1: GUI baseada em cliente File Transfer

CORBA versus RMI
Code-sábio, é claro que RMI é mais simples de trabalhar com uma vez que o desenvolvedor Java não
precisa estar familiarizado com a Interface Definition Language (IDL). Em geral, contudo, difere de CORBA
RMI nas seguintes áreas:


   Interfaces de CORBA são definidos em IDL e interfaces de RMI são definidos em Java. RMI-IIOP
    permite que você escreva todas as interfaces em Java (ver RMI-IIOP ).
   CORBA suporta in e out parâmetros, enquanto RMI não faz desde que os objetos locais são
    passados por cópia e objetos remotos são passados por referência.
   CORBA foi projetado com independência de linguagem em mente. Isso significa que alguns dos objetos
    podem ser escritos em Java, por exemplo, e outros objetos podem ser escritos em C + + e ainda que
    todos eles podem interoperar. Portanto, CORBA é um mecanismo ideal para colmatar ilhas entre
    diferentes linguagens de programação. Por outro lado, RMI foi projetado para uma única língua em que
    todos os objetos são escritos em Java. Note no entanto, com RMI-IIOP é possível alcançar a
    interoperabilidade.
   Objetos CORBA não são lixo coletado. Como mencionamos, CORBA é independente de linguagem e
    algumas linguagens (C + +, por exemplo) não suportam a coleta de lixo. Isto pode ser considerado uma
    desvantagem já que uma vez um objeto CORBA é criado, ele continua a existir até que você se livrar
    dele, e decidir quando se livrar de um objeto não é uma tarefa trivial. Por outro lado, os objetos RMI são
    lixo coletado automaticamente.


Conclusão
Desenvolvimento de objetos distribuídos aplicações baseadas pode ser feito em Java utilizando RMI ou
JavaIDL (uma implementação de CORBA). O uso de ambas as tecnologias é semelhante uma vez que o
primeiro passo consiste em definir uma interface para o objecto. Ao contrário de RMI, no entanto, onde
interfaces são definidas em Java, as interfaces de CORBA são definidos na linguagem de definição de
interface (IDL). Isso, no entanto, acrescenta outra camada de complexidade, onde o desenvolvedor precisa
estar familiarizado com IDL, e igualmente importante, o mapeamento para Java.

Fazer uma seleção entre estes dois mecanismos de distribuição realmente depende do projeto na mão e
seus requisitos. Espero que este artigo lhe forneceu informações suficientes para começar a desenvolver
distribuídas objeto e aplicações de base de orientação o suficiente para ajudá-lo a selecionar um
mecanismo de distribuição.

Para mais informações
- RMI
- Especificação CORBA (OMG)
- JavaIDL
- Programação Distribuída com Java livro (Capítulo 11: Visão geral de CORBA)
- Servidor CORBA e cliente Servlet
- RMI-IIOP

More Related Content

What's hot

C# 6.0 - Novos Recursos (Agosto/2015)
C# 6.0 - Novos Recursos (Agosto/2015)C# 6.0 - Novos Recursos (Agosto/2015)
C# 6.0 - Novos Recursos (Agosto/2015)Renato Groff
 
Objetos distribuídos e invocação remota - CORBA
Objetos distribuídos e invocação remota - CORBAObjetos distribuídos e invocação remota - CORBA
Objetos distribuídos e invocação remota - CORBAWagner Bonfim
 
Microsoft Community Launch 2010: .NET Framework 4
Microsoft Community Launch 2010: .NET Framework 4Microsoft Community Launch 2010: .NET Framework 4
Microsoft Community Launch 2010: .NET Framework 4Rogério Moraes de Carvalho
 
1089335456 paper 4 sockets em java
1089335456 paper 4   sockets em java1089335456 paper 4   sockets em java
1089335456 paper 4 sockets em javajosealcides2005
 
Postfix
PostfixPostfix
PostfixTiago
 
Dev401 novos recursos do microsoft visual basic 2010
Dev401 novos recursos do microsoft visual basic 2010Dev401 novos recursos do microsoft visual basic 2010
Dev401 novos recursos do microsoft visual basic 2010Alexandre Tarifa
 
Curso Java Basico
Curso Java BasicoCurso Java Basico
Curso Java BasicoJoel Lobo
 
Sistemas Distribuídos - Comunicação Distribuída - EJB
Sistemas Distribuídos - Comunicação Distribuída - EJBSistemas Distribuídos - Comunicação Distribuída - EJB
Sistemas Distribuídos - Comunicação Distribuída - EJBAdriano Teixeira de Souza
 
Carlos Beiga - Aula06 - Postfix
Carlos Beiga - Aula06 - PostfixCarlos Beiga - Aula06 - Postfix
Carlos Beiga - Aula06 - PostfixHeber Souza
 
40 php orientado a objetos
40 php orientado a objetos40 php orientado a objetos
40 php orientado a objetosFrancisco Santos
 
php orientado_a_objetos
php orientado_a_objetosphp orientado_a_objetos
php orientado_a_objetosFer Nando
 
Palestra: LINQ via C#
Palestra: LINQ via C# Palestra: LINQ via C#
Palestra: LINQ via C# Thiago Vidal
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsEduardo Mendes
 

What's hot (19)

Apostila de C# & Asp.Net
Apostila de C# & Asp.NetApostila de C# & Asp.Net
Apostila de C# & Asp.Net
 
RMI em Java
RMI em JavaRMI em Java
RMI em Java
 
Fundamentos de JDBC
Fundamentos de JDBCFundamentos de JDBC
Fundamentos de JDBC
 
C# 6.0 - Novos Recursos (Agosto/2015)
C# 6.0 - Novos Recursos (Agosto/2015)C# 6.0 - Novos Recursos (Agosto/2015)
C# 6.0 - Novos Recursos (Agosto/2015)
 
Objetos distribuídos e invocação remota - CORBA
Objetos distribuídos e invocação remota - CORBAObjetos distribuídos e invocação remota - CORBA
Objetos distribuídos e invocação remota - CORBA
 
Microsoft Community Launch 2010: .NET Framework 4
Microsoft Community Launch 2010: .NET Framework 4Microsoft Community Launch 2010: .NET Framework 4
Microsoft Community Launch 2010: .NET Framework 4
 
1089335456 paper 4 sockets em java
1089335456 paper 4   sockets em java1089335456 paper 4   sockets em java
1089335456 paper 4 sockets em java
 
Postfix
PostfixPostfix
Postfix
 
Dev401 novos recursos do microsoft visual basic 2010
Dev401 novos recursos do microsoft visual basic 2010Dev401 novos recursos do microsoft visual basic 2010
Dev401 novos recursos do microsoft visual basic 2010
 
Curso Java Basico
Curso Java BasicoCurso Java Basico
Curso Java Basico
 
Aula06 - postfix
Aula06 -  postfixAula06 -  postfix
Aula06 - postfix
 
Sistemas Distribuídos - Comunicação Distribuída - EJB
Sistemas Distribuídos - Comunicação Distribuída - EJBSistemas Distribuídos - Comunicação Distribuída - EJB
Sistemas Distribuídos - Comunicação Distribuída - EJB
 
Aula06 - postfix
Aula06 -  postfixAula06 -  postfix
Aula06 - postfix
 
Carlos Beiga - Aula06 - Postfix
Carlos Beiga - Aula06 - PostfixCarlos Beiga - Aula06 - Postfix
Carlos Beiga - Aula06 - Postfix
 
40 php orientado a objetos
40 php orientado a objetos40 php orientado a objetos
40 php orientado a objetos
 
php orientado_a_objetos
php orientado_a_objetosphp orientado_a_objetos
php orientado_a_objetos
 
Palestra: LINQ via C#
Palestra: LINQ via C# Palestra: LINQ via C#
Palestra: LINQ via C#
 
Java Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e ServletsJava Web - MVC básico com JSP e Servlets
Java Web - MVC básico com JSP e Servlets
 
Curso de Servlets
Curso de ServletsCurso de Servlets
Curso de Servlets
 

Similar to Comparação RMI e CORBA para transferência de arquivos

Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Vinícius de Paula
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Elton Minetto
 
Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5Lucas Augusto Carvalho
 
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...Tchelinux
 
Servidor de Aplicação Web: CherryPy - Python
Servidor de Aplicação  Web: CherryPy - PythonServidor de Aplicação  Web: CherryPy - Python
Servidor de Aplicação Web: CherryPy - Pythonantonio sérgio nogueira
 
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPy
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPyDesenvolvendo uma Aplicação WEB usando o Python e o CherryPy
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPyantonio sérgio nogueira
 
PHP like a super hero
PHP like a super heroPHP like a super hero
PHP like a super heroElton Minetto
 
Slide 01 introdução ao php e ao code igniter
Slide 01   introdução ao php e ao code igniterSlide 01   introdução ao php e ao code igniter
Slide 01 introdução ao php e ao code igniterRaniere de Lima
 
Spring & Struts
Spring & StrutsSpring & Struts
Spring & Strutseduan
 
Sistemas Distribuidos Java
Sistemas Distribuidos JavaSistemas Distribuidos Java
Sistemas Distribuidos Javalimadavi
 

Similar to Comparação RMI e CORBA para transferência de arquivos (20)

Funmentos de Objetos Remotos
Funmentos de Objetos RemotosFunmentos de Objetos Remotos
Funmentos de Objetos Remotos
 
6-RMI.pdf
6-RMI.pdf6-RMI.pdf
6-RMI.pdf
 
Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.Desenvolvimento Web com Simfony Framework.
Desenvolvimento Web com Simfony Framework.
 
Palestra
PalestraPalestra
Palestra
 
Introdução ao Zend Framework 2
Introdução ao Zend Framework 2Introdução ao Zend Framework 2
Introdução ao Zend Framework 2
 
Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5Palestra - Symfony Framework MVC PHP 5
Palestra - Symfony Framework MVC PHP 5
 
RMI (Remote Method Invocation)
RMI (Remote Method Invocation) RMI (Remote Method Invocation)
RMI (Remote Method Invocation)
 
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
Iniciando com Yii Framework - Volmar Machado da Silva Neto (Rede Pampa de Com...
 
Servidor de Aplicação Web: CherryPy - Python
Servidor de Aplicação  Web: CherryPy - PythonServidor de Aplicação  Web: CherryPy - Python
Servidor de Aplicação Web: CherryPy - Python
 
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPy
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPyDesenvolvendo uma Aplicação WEB usando o Python e o CherryPy
Desenvolvendo uma Aplicação WEB usando o Python e o CherryPy
 
PHP like a super hero
PHP like a super heroPHP like a super hero
PHP like a super hero
 
Apostila de-vb-net
Apostila de-vb-netApostila de-vb-net
Apostila de-vb-net
 
Slide 01 introdução ao php e ao code igniter
Slide 01   introdução ao php e ao code igniterSlide 01   introdução ao php e ao code igniter
Slide 01 introdução ao php e ao code igniter
 
PHP no Google AppEngine
PHP no Google AppEnginePHP no Google AppEngine
PHP no Google AppEngine
 
XML-RPC.pdf
XML-RPC.pdfXML-RPC.pdf
XML-RPC.pdf
 
APM Model in .NET - PT-pt
APM Model in .NET - PT-ptAPM Model in .NET - PT-pt
APM Model in .NET - PT-pt
 
Rmi (remote method invocation)
Rmi (remote method invocation)Rmi (remote method invocation)
Rmi (remote method invocation)
 
J530 4 rmi
J530 4 rmiJ530 4 rmi
J530 4 rmi
 
Spring & Struts
Spring & StrutsSpring & Struts
Spring & Struts
 
Sistemas Distribuidos Java
Sistemas Distribuidos JavaSistemas Distribuidos Java
Sistemas Distribuidos Java
 

Comparação RMI e CORBA para transferência de arquivos

  • 1. Artigo Distribuído Programação Java com RMI e CORBA Versão para Impressão Índice de artigos Qusay H. Mahmoud Janeiro 2002 O Java Remote Method Invocation mecanismo (RMI) e Common Object Request Broker Architecture (CORBA) são os dois mais importantes e amplamente utilizados sistemas de objetos distribuídos. Cada sistema tem suas próprias características e limitações. Ambos estão sendo usados na indústria para várias aplicações que vão desde e-commerce aos cuidados de saúde. Seleção de qual desses dois mecanismos de distribuição de usar para um projeto é uma tarefa difícil. Este artigo apresenta uma visão geral da RMI e CORBA, e mais importante ainda, mostra como desenvolver uma aplicação útil para download de arquivos de hosts remotos. Em seguida:  Apresenta uma breve descrição dos sistemas de objetos distribuídos  Fornece uma visão geral de RMI e CORBA  Dá-lhe um sabor do esforço envolvido no desenvolvimento de aplicações em RMI e CORBA  Mostra como transferir arquivos de máquinas remotas usando RMI e CORBA  Fornece uma breve comparação de RMI e CORBA O modelo cliente / servidor O modelo cliente / servidor é uma forma de computação distribuída em que um programa (o cliente) se comunica com outro programa (o servidor) com o objetivo de trocar informações. Neste modelo, o cliente eo servidor geralmente falam a mesma língua - um protocolo que o cliente eo servidor de entender - para que eles sejam capazes de se comunicar. Enquanto o modelo de cliente / servidor pode ser implementada de várias maneiras, ele é tipicamente feito usando baixo nível sockets. Usando sockets para desenvolver sistemas cliente / servidor significa que devemos projetar um protocolo, que é um conjunto de comandos acordadas pelo cliente e servidor através do qual eles serão capazes de se comunicar. Como exemplo, considere o protocolo HTTP que fornece um método chamado GET , que deve ser implementada por todos os servidores web e usado por clientes web (browsers), a fim de recuperar os documentos. O Modelo de Objetos Distribuído Um sistema baseado em objeto distribuído é uma coleção de objetos que isola os solicitantes de serviços (clientes) de os prestadores de serviços (servidores) por uma interface bem definida de encapsulamento. Em outras palavras, os clientes são isoladas a partir da implementação de serviços de dados como representações e de código executável. Esta é uma das principais diferenças que distinguem o modelo baseado em objetos distribuídos a partir do modelo cliente / servidor puro. No modelo baseado em objetos distribuídos, um cliente envia uma mensagem a um objeto, que por sua vez interpreta a mensagem para decidir que serviço a executar. Este serviço, ou método, a seleção poderia ser realizada por qualquer objeto ou um corretor. O Java Remote Method Invocation (RMI) e Common Object Request Broker Architecture (CORBA) são exemplos deste modelo. RMI RMI é um sistema de objetos distribuídos que lhe permite desenvolver facilmente aplicações distribuídas em Java. Desenvolvimento de aplicações distribuídas em RMI é mais simples do que desenvolver com sockets, pois não há necessidade de criar um protocolo, que é uma tarefa propensa a erros. Em RMI, o desenvolvedor tem a ilusão de chamar um método local de um arquivo de classe local, quando na verdade os argumentos são enviados para o destino remoto e interpretados, e os resultados são enviados de volta para os chamadores.
  • 2. A Gênese de uma aplicação RMI Desenvolver um aplicativo distribuído usando RMI envolve as seguintes etapas: 1. Definir uma interface remota 2. Implementar a interface remota 3. Desenvolver o servidor 4. Desenvolver um cliente 5. Gerar Stubs e Skeletons, inicie o registro RMI, servidor e cliente Agora, vamos examinar esses passos através do desenvolvimento de uma aplicação de transferência de arquivo. Exemplo: Aplicação de Transferência de Arquivos Esta aplicação permite que um cliente transferir (ou download) qualquer tipo de arquivo (texto ou binário) de uma máquina remota. O primeiro passo é definir uma interface remota que especifica as assinaturas dos métodos a serem fornecidos pelo servidor e invocado pelos clientes. Definir uma interface remota A interface remota para o aplicativo de download de arquivo é mostrado no código de exemplo 1. A interface FileInterface fornece um método downloadFile que leva uma String argumento (o nome do arquivo) e retorna os dados do arquivo como um array de bytes. Amostra de código 1: FileInterface.java importar java.rmi.Remote; java.rmi.RemoteException de importação; public interface FileInterface estende remoto { public byte [] DownloadFile (String fileName) throws RemoteException; } Observe as seguintes características sobre o FileInterface :  Deve ser declarada public , para que os clientes para ser capaz de carregar objetos remotos que implementam a interface remota.  Deve estender a Remote interface, para cumprir a exigência para fazer o objeto a um controle remoto.  Cada método da interface deve lançar um java.rmi.RemoteException . Implementar a interface remota O próximo passo é implementar a interface FileInterface . A implementação de exemplo é mostrado na Amostra de código 2. Observe que, além de implementar a FileInterface , o FileImpl classe está estendendo a UnicastRemoteObject . Isto indica que o FileImpl classe é usada para criar uma única, não-replicado objecto, remoto que utiliza padrão RMI de transporte baseado em TCP para a comunicação. Amostra de código 2: FileImpl.java import java.io. *; importar java.rmi *.; importação classe java.rmi.server.UnicastRemoteObject; public class FileImpl estende UnicastRemoteObject implementa FileInterface { private String nome; público FileImpl (String s) throws RemoteException { super (); name = s;
  • 3. } public byte [] DownloadFile (String fileName) { try { Arquivo file = new File (fileName); buffer de byte [] = new byte [file.length (int) ()]; BufferedInputStream entrada = new BufferedInputStream (new FileInputStream (fileName)); input.read (buffer, 0, buffer.Length); input.close (); retorno (buffer); } Catch (Exception e) { System.out.println ("FileImpl:" + e.getMessage ()); e.printStackTrace (); return (null); } } } Desenvolver o servidor O terceiro passo é o de desenvolver um servidor. Há três coisas que o servidor precisa fazer: 1. Criar uma instância do RMISecurityManager e instalá-lo 2. Criar uma instância do objeto remoto ( FileImpl neste caso) 3. Registre o objeto criado com o registro RMI. A implementação de exemplo é mostrado na 3 Amostra de código. Amostra de código 3: FileServer.java import java.io. *; importar java.rmi *.; FileServer public class { public static void main (String argv []) { if (System.getSecurityManager () == null) { System.setSecurityManager (novo RMISecurityManager ()); } try { FileInterface fi = new FileImpl ("FileServer"); Naming.rebind ("/ 127.0.0.1/FileServer /", fi); } Catch (Exception e) { System.out.println ("FileServer:" + e.getMessage ()); e.printStackTrace (); } } } A declaração Naming.rebind("//127.0.0.1/FileServer", fi) assume que o registro RMI está sendo executado o número da porta padrão, que é 1099. No entanto, se você executar o registro RMI em um número de porta diferente, deve ser especificado nessa declaração. Por exemplo, se o registro RMI é executado na porta 4500, então a declaração torna-se: Naming.rebind("//127.0.0.1:4500/FileServer", fi) Além disso, é importante notar aqui que nós assumimos o RMI Registry eo servidor estará rodando na mesma máquina. Se não forem, então simplesmente mudar o endereço no rebind método. Desenvolver um cliente O passo seguinte é o de desenvolver um cliente. O cliente invoca remotamente todos os métodos especificados na interface remota ( FileInterface ). Para isso no entanto, o cliente deve primeiro obter uma referência para o objeto remoto a partir do registro RMI. Uma vez que uma referência é obtido, o downloadFile método é invocado. A aplicação cliente é apresentado em 4 Amostra de código. Nesta implementação, o cliente aceita dois argumentos na linha de comando: o primeiro é o nome do arquivo a ser baixado eo segundo é o endereço da máquina do qual o arquivo deve ser baixado, que é a máquina que
  • 4. está executando o servidor de arquivos. Amostra de código 4: FileClient.java import java.io. *; importar java.rmi *.; public class {FileClient public static void main (String argv []) { if (argv.length! = 2) { System.out.println ("Uso: java fileName FileClient machineName"); System.exit (0); } try { String nome = "/ /" + argv [1] + "FileServer /"; FileInterface fi = Naming.lookup (FileInterface) (nome); byte [] = filedata fi.downloadFile (argv [0]); Arquivo file = new File (argv [0]); Saída BufferedOutputStream = new BufferedOutputStream (new FileOutputStream (file.getName ())); output.write (filedata, 0, filedata.length); output.flush (); output.close (); } Catch (Exception e) { System.err.println ("exceção FileServer:" + e.getMessage ()); e.printStackTrace (); } } } Executando o aplicativo Para executar o aplicativo, é preciso gerar stubs e esqueletos, compilar o servidor eo cliente, inicie o registro RMI e, finalmente, iniciar o servidor eo cliente. Para gerar stubs e esqueletos, utilize o rmic compilador: prompt> rmic FileImpl Isso irá gerar dois arquivos: FileImpl_Stub.class e FileImpl_Skel.class . O stub é um proxy do cliente e o esqueleto é um esqueleto do servidor. O próximo passo é compilar o servidor eo cliente. Use o javac compilador para fazer isso. Note, no entanto, se o servidor eo cliente são desenvolvidos em duas máquinas diferentes, a fim de compilar o cliente precisar de uma cópia da interface ( FileInterface ). Finalmente, é hora de começar o registro RMI e executar o servidor eo cliente. Para iniciar o registro RMI no número da porta padrão, use o comando rmiregistry ou start rmiregistry no Windows. Para iniciar o registro RMI em um número de porta diferente, fornecer o número da porta como um argumento para o registro RMI: prompt> rmiregistry portNumber Uma vez que o registro RMI é executado, você pode iniciar o servidor FileServer . No entanto, desde a RMI gestor de segurança está sendo usado no aplicativo de servidor, você precisa de uma política de segurança para ir com ele. Aqui está uma política de segurança da amostra: grant { java.security.AllPermission permissão "", ""; }; Nota: este é apenas um exemplo de política. Ele permite que ninguém a fazer nada. Para suas aplicações de missão crítica, você precisa especificar as políticas de segurança mais restrição. Agora, para iniciar o servidor precisar de uma cópia de todas as classes (incluindo stubs e esqueletos), exceto a classe cliente ( FileClient.class ). Para iniciar o servidor use o seguinte comando, assumindo que a política de segurança está em um arquivo chamado Policy.txt:
  • 5. prompt> java -Djava.security.policy=policy.txt FileServer Para iniciar o cliente em uma máquina diferente, você precisa de uma cópia da interface remota ( FileInterface.class ) e stub ( FileImpl_Stub.class ). Para iniciar o cliente use o comando: prompt> java FileClient fileName machineName onde fileName é o arquivo a ser baixado e machineName é a máquina onde o arquivo está localizado (a mesma máquina roda o servidor de arquivos). Se tudo der certo, em seguida, o cliente existe e é o arquivo baixado na máquina local. Para executar o cliente, mencionou que você precisa de uma cópia da interface e stub. Uma maneira mais adequada de fazer isso é usar RMI carregamento dinâmico de classe. A idéia é que você não precisa de cópias da interface e do topo. Em vez disso, eles podem ser localizados em um diretório compartilhado para o servidor eo cliente, e sempre que um esboço ou um esqueleto é necessária, ela será baixada automaticamente pelo carregador de classe RMI. Para fazer isso você executar o cliente, por exemplo, usando o seguinte comando: java - Djava.rmi.server.codebase=http://hostname/locationOfClasses FileClient fileName machineName . Para mais informações sobre este assunto, consulte Carregando dinâmicas de código usando RMI . CORBA O Common Object Request Broker Architecture (CORBA ou) é um padrão da indústria desenvolvido pelo Object Management Group (OMG) para auxiliar na programação distribuída objetos. É importante notar que CORBA é simplesmente uma especificação. A implementação CORBA é conhecido como um ORB (ou Object Request Broker). Existem várias implementações de CORBA disponíveis no mercado, tais como VisiBroker e Orbix, e outros. JavaIDL é outra aplicação que vem como um pacote de base com o JDK1.3 ou superior. CORBA foi projetado para ser plataforma e linguagem independente. Portanto, objetos CORBA pode ser executado em qualquer plataforma, localizada em qualquer ponto da rede, e podem ser escritos em qualquer língua que tem Language Interface Definition Language (IDL) mapeamentos. Similar a RMI, objetos CORBA são especificadas com interfaces. As interfaces em CORBA, no entanto, são especificadas em IDL. Enquanto IDL é semelhante ao C + +, é importante notar que IDL não é uma linguagem de programação. Para uma introdução detalhada ao CORBA, consulte Programação distribuída com Java: Capítulo 11 (Visão geral de CORBA) . A Gênese de uma Aplicação CORBA Há um número de passos envolvidos no desenvolvimento de aplicações CORBA. Estes são: 1. Definir uma interface em IDL 2. Mapa da interface IDL para Java (feito automaticamente) 3. Implementar a interface 4. Desenvolver o servidor 5. Desenvolver um cliente 6. Executar o serviço de nomes, o servidor eo cliente. Vamos agora explicar cada passo a passos através do desenvolvimento de uma aplicação de transferência baseado em CORBA arquivo, que é semelhante à aplicação RMI foi desenvolvido no início deste artigo. Aqui estaremos usando o JavaIDL, que é um pacote essencial de JDK1.3 +. Definir a interface Ao definir uma interface CORBA, pensar sobre o tipo de operações que o servidor irá suportar. No pedido de transferência de arquivo, o cliente irá chamar um método para baixar um arquivo. Amostra de código 5 mostra a interface para FileInterface . Data é um novo tipo introduzidos utilizando o typedef palavra-chave. Uma sequence em IDL é semelhante a uma matriz excepto que uma sequência não tem um tamanho fixo. Um octet é uma quantidade de 8-bits que é equivalente ao tipo Java byte .
  • 6. Note que o downloadFile método recebe um parâmetro do tipo string que é declarada in . IDL define três de passagem de parâmetro modos: in (para a entrada do cliente para o servidor), out (para a saída do servidor para o cliente), e inout (usado para entrada e saída). Amostra de código 5: FileInterface.idl interface de FileInterface { Dados <octet> typedef seqüência; Dados DownloadFile (em string fileName); }; Uma vez que você terminar de definir a interface IDL, você está pronto para compilá-lo. O + JDK1.3 vem com o idlj compilador, que é usado para definições de mapa em declarações IDL Java e declarações. O idlj compilador aceita opções que permitem que você especifique se você deseja gerar stubs de cliente, esqueletos de servidor, ou ambos. O -f<side> opção é usada para especificar o que gerar. Oside pode ser client , server , ou all para stubs cliente e esqueletos de servidor. Neste exemplo, uma vez que o aplicativo será executado em duas máquinas separadas, o -fserver opção é utilizado no lado do servidor, e -fclient opção é usada no lado do cliente. Agora, vamos compilar o FileInterface.idl e gerar esqueletos do lado do servidor. Usando o comando: prompt> idlj -fserver FileInterface.idl Este comando gera vários arquivos, como esqueletos, suporte e classes auxiliares, e outros. Um arquivo importante que é gerado é o _FileInterfaceImplBase , que vai ser uma subclasse da classe que implementa a interface. Implementar a interface Agora, nós fornecemos uma implementação para o downloadFile método. Esta implementação é conhecido como um servo, e como você pode ver a partir de Amostra de código 6, a classe FileServantestende a _FileInterfaceImplBase classe para especificar que este servo é um objeto CORBA. Amostra de código 6: FileServant.java import java.io. *; public class extends FileServant _FileInterfaceImplBase { public byte [] DownloadFile (String fileName) { Arquivo file = new File (fileName); buffer de byte [] = new byte [file.length (int) ()]; try { BufferedInputStream entrada = new BufferedInputStream (new FileInputStream (fileName)); input.read (buffer, 0, buffer.Length); input.close (); } Catch (Exception e) { System.out.println ("Erro FileServant:" + e.getMessage ()); e.printStackTrace (); } retorno (buffer); } } Desenvolver o servidor O próximo passo é desenvolver o servidor CORBA. O FileServer classe, mostrado no código de exemplo 7, implementa um servidor CORBA que faz o seguinte: 1. Inicializa o ORB 2. Cria um objeto FileServant
  • 7. 3. Registra o objeto no CORBA Naming Service (COS Naming) 4. Imprime uma mensagem de status 5. Aguarda solicitações de cliente recebidas Amostra de código 7: FileServer.java import java.io. *; importar org.omg.CosNaming *.; importar org.omg.CosNaming.NamingContextPackage *.; importar org.omg.CORBA *.; FileServer public class { public static void main (String args []) { try { / / Criar e inicializar o ORB ORB orb = ORB.init (args, null); / / Cria o servo e registrá-lo com o ORB Fileref FileServant FileServant = new (); orb.connect (fileref); / / Obter o contexto de nomeação de raiz org.omg.CORBA.Object objRef = orb.resolve_initial_references ("NameService"); NamingContext ncRef = NamingContextHelper.narrow (objRef); / / Vincular o objeto de referência na nomeação NameComponent nc = new NameComponent ("FileTransfer", ""); NameComponent caminho [] = {nc}; ncRef.rebind (caminho, fileref); System.out.println ("Servidor começou ...."); / / Espera invocações dos clientes sync java.lang.Object java.lang.Object = new (); sincronizado (sync) { sync.wait (); } } Catch (Exception e) { System.out.println ("ERRO:" + e.getMessage ()); e.printStackTrace (System.out); } } } Uma vez que o FileServer tem um ORB, ele pode registrar o serviço CORBA. Ele usa o serviço COS Naming especificado pelo OMG e implementado por Java IDL para fazer o registro. Ele começa por obter uma referência para a raiz do serviço de nomes. Isso retorna um objeto CORBA genérico. Para usá-lo como um NamingContext objecto, ele deve ser reduzida (por outras palavras, fundido) para o seu tipo próprio, e isto é feito utilizando a instrução: NamingContext ncRef = NamingContextHelper.narrow(objRef); O ncRef objeto é agora um org.omg.CosNaming.NamingContext . Você pode usá-lo para registrar um serviço CORBA com o serviço de identificação usando o rebind método. Desenvolver um cliente O passo seguinte é o de desenvolver um cliente. Uma implementação é mostrado na exemplo de código 8. Uma vez que uma referência para o serviço de identificação foi obtido, pode ser utilizado para aceder ao serviço de identificação e encontrar outros serviços (por exemplo, o FileTransfer serviço). Quando o FileTransfer serviço for encontrado, o downloadFile método é chamado. Amostra de código 8: FileClient import java.io. *; * import java.util.; importar org.omg.CosNaming *.; importar org.omg.CORBA *.; public class {FileClient public static void main (String argv []) { try {
  • 8. / / Criar e inicializar o ORB ORB orb = ORB.init (argv, null); / / Obter o contexto de nomeação de raiz org.omg.CORBA.Object objRef = orb.resolve_initial_references ("NameService"); NamingContext ncRef = NamingContextHelper.narrow (objRef); NameComponent nc = new NameComponent ("FileTransfer", ""); / / Resolve o objeto de referência na nomeação NameComponent caminho [] = {nc}; FileInterfaceOperations fileref = FileInterfaceHelper.narrow (ncRef.resolve (caminho)); if (argv.length <1) { System.out.println ("Uso: java FileClient filename"); } / / Salvar o arquivo Arquivo file = new File (argv [0]); dados de byte [] = fileRef.downloadFile (argv [0]); Saída BufferedOutputStream = new BufferedOutputStream (new FileOutputStream (argv [0])); output.write (dados, 0, data.length); output.flush (); output.close (); } Catch (Exception e) { System.out.println ("Erro FileClient:" + e.getMessage ()); e.printStackTrace (); } } } Executando o aplicativo O passo final é executar o aplicativo. Existem várias sub-etapas envolvidas: 1. A execução do serviço de nomes CORBA o. Isto pode ser feito usando o comando tnameserv . Por padrão, ele é executado na porta 900. Se você não pode executar o serviço de nomes nesta porta, então você pode iniciá-lo em outra porta. Para iniciá-lo na porta 2500, por exemplo, use o seguinte comando: prompt> tnameserv -ORBinitialPort 2500 2. Iniciar o servidor. Isto pode ser feito da seguinte forma, supondo que o serviço de nomes está sendo executado no número de porta padrão: prompt> java FileServer Se o serviço de nomes está sendo executado em um número de porta diferente, digamos 2500, então você precisa especificar a porta usando o ORBInitialPort opção da seguinte forma: prompt> java FileServer -ORBInitialPort 2500 3. Gerar Stubs para o cliente. Antes de executar o cliente, precisamos gerar stubs para o cliente. Para isso, obter uma cópia do FileInterface.idl arquivo e compilá-lo usando o compilador idlj especificando que você deseja gerar stubs do lado do cliente, como segue: prompt> idlj -fclient FileInterface.idl 4. Execute o cliente. Agora você pode executar o cliente usando o seguinte comando, assumindo que o serviço de nomes é executado na porta 2500. prompt> java FileClient hello.txt -ORBInitialPort 2500 Onde hello.txt é o arquivo que deseja baixar a partir do servidor.
  • 9. Nota: se o serviço de nomes está sendo executado em um host diferente, então use o - ORBInitialHost opção para especificar onde ele está sendo executado. Por exemplo, se o serviço de nomes está sendo executado na porta de número 4500 em um host com o nome de gosling , então você começa o cliente como se segue: prompt> java FileClient hello.txt -ORBInitialHost gosling - ORBInitialPort 4500 Alternativamente, essas opções podem ser especificadas no nível do código usando as propriedades. Então, ao invés de inicializar o ORB como: ORB orb = ORB.init(argv, null); Ele pode ser inicializado especificando que a máquina do servidor CORBA (chamado Gosling) e número do serviço de identificação do porta (a ser 2500) como se segue: Properties props = new Properties (); props.put ("org.omg.CORBA.ORBInitialHost", "gosling"); props.put ("orb.omg.CORBA.ORBInitialPort", "2500"); ORB orb = ORB.init (args, props); Exercer No pedido de transferência de arquivo, o cliente (em ambos os casos, RMI e CORBA) precisa saber o nome do arquivo a ser baixado com antecedência. Não há métodos são fornecidos para listar os arquivos disponíveis no servidor. Como um exercício, você pode querer melhorar a aplicação, adicionando um outro método que lista os arquivos disponíveis no servidor. Além disso, em vez de usar um cliente de linha de comando você pode querer desenvolver um cliente baseado em GUI. Quando o cliente é iniciado, ele chama um método no servidor para obter uma lista de arquivos, em seguida aparece um menu contendo os arquivos disponíveis onde o usuário seria capaz de selecionar um ou mais arquivos a serem baixados, como mostrado na Figura 1. Figura 1: GUI baseada em cliente File Transfer CORBA versus RMI
  • 10. Code-sábio, é claro que RMI é mais simples de trabalhar com uma vez que o desenvolvedor Java não precisa estar familiarizado com a Interface Definition Language (IDL). Em geral, contudo, difere de CORBA RMI nas seguintes áreas:  Interfaces de CORBA são definidos em IDL e interfaces de RMI são definidos em Java. RMI-IIOP permite que você escreva todas as interfaces em Java (ver RMI-IIOP ).  CORBA suporta in e out parâmetros, enquanto RMI não faz desde que os objetos locais são passados por cópia e objetos remotos são passados por referência.  CORBA foi projetado com independência de linguagem em mente. Isso significa que alguns dos objetos podem ser escritos em Java, por exemplo, e outros objetos podem ser escritos em C + + e ainda que todos eles podem interoperar. Portanto, CORBA é um mecanismo ideal para colmatar ilhas entre diferentes linguagens de programação. Por outro lado, RMI foi projetado para uma única língua em que todos os objetos são escritos em Java. Note no entanto, com RMI-IIOP é possível alcançar a interoperabilidade.  Objetos CORBA não são lixo coletado. Como mencionamos, CORBA é independente de linguagem e algumas linguagens (C + +, por exemplo) não suportam a coleta de lixo. Isto pode ser considerado uma desvantagem já que uma vez um objeto CORBA é criado, ele continua a existir até que você se livrar dele, e decidir quando se livrar de um objeto não é uma tarefa trivial. Por outro lado, os objetos RMI são lixo coletado automaticamente. Conclusão Desenvolvimento de objetos distribuídos aplicações baseadas pode ser feito em Java utilizando RMI ou JavaIDL (uma implementação de CORBA). O uso de ambas as tecnologias é semelhante uma vez que o primeiro passo consiste em definir uma interface para o objecto. Ao contrário de RMI, no entanto, onde interfaces são definidas em Java, as interfaces de CORBA são definidos na linguagem de definição de interface (IDL). Isso, no entanto, acrescenta outra camada de complexidade, onde o desenvolvedor precisa estar familiarizado com IDL, e igualmente importante, o mapeamento para Java. Fazer uma seleção entre estes dois mecanismos de distribuição realmente depende do projeto na mão e seus requisitos. Espero que este artigo lhe forneceu informações suficientes para começar a desenvolver distribuídas objeto e aplicações de base de orientação o suficiente para ajudá-lo a selecionar um mecanismo de distribuição. Para mais informações - RMI - Especificação CORBA (OMG) - JavaIDL - Programação Distribuída com Java livro (Capítulo 11: Visão geral de CORBA) - Servidor CORBA e cliente Servlet - RMI-IIOP