Vous êtes sur la page 1sur 26

TutorialdeCORBAdesdeJava

1.Introduccin
1.1.Aplicacionesdistribuidas
1.1.1.Datosdistribuidos
1.1.2.Computacindistribuida
1.1.3.Usuariosdistribuidos
1.2.RealidaddelosSistemasDistribuidos
1.3.SistemadeObjetosDistribuidos
1.4.QuesCORBA?
1.4.1.ElOMG
1.4.2.LaarquitecturaCORBA
1.4.3.ElORB
1.4.4.CORBAcomounEstandarparaObjetosDistribuidos
1.4.5.ServiciosCORBA
1.4.6.ProductosCORBA

2.ProcesodedesarrolloenJavaIDL
2.1.DefinirelInterfazRemoto
2.2.CompilarelInterfazRemoto
2.3.ImplementarelServidor
2.4.ImplementarelCliente
2.5.Iniciarlasaplicaciones

3.Ejemplo"Helloworld"enCliente/Servidor

4.EscribirelinterfazIDL
4.1.EscribiendoHello.idl
4.1.1.DeclararelMduloIDLdeCORBA
4.1.2.DeclararlaInterface
4.1.3.DeclarandolasOperaciones
4.2.MapeandoHello.idldeIDLaJava
4.3.Comprendientolasalidadeidl2java
4.3.1._HelloImplBase.java
4.3.2._HelloStub.java

4.3.3.Hello.java
4.3.4.HelloHelper.java
4.3.5.HelloHolder.java

5.DesarrollodelCliente
5.1.Realizarunaconfiguracinbsica
5.1.1.Importandolospaquetesrequeridos
5.1.2.Declarandolaclasedelcliente
5.1.3.Definiendoelmtodomain
5.1.4.ManejandolasexcepcionesCORBA
5.2.CrearunobjetoORB
5.3.EncontrarelServidorHello
5.3.1.ObtenerelContextoInicialdeNombrado
5.3.2.AjustarlaReferenciaaObjeto
5.3.3.EncontrarunServiciodeNombrado
5.4.InvocandolaOperacinsayHello

6.DesarrollodelServidor
6.1.Realizandounaconfiguracinbsica
6.1.1.Importandolospaquetesrequeridos
6.1.2.Declarandolaclasedelservidor
6.1.3.Definiendoelmtodomain
6.1.4.ManejandolasexcepcionesCORBA
6.2.CrearunobjetoORB
6.3.AdministrandoelObjetoSirviente
6.3.1.InstanciandoelObjetoSirviente
6.3.2.DefiniendolaClaseSirviente
6.4.TrabajandoconelNombramientoCOS
6.4.1.ObteniendoelContextoInicialdeNombramiento
6.4.2.AjustandolaReferenciaaObjeto
6.4.3.RegistrarelSirvienteenelServidordeNombres
6.5.Esperandoalapeticin

7.Compilandoyejecutandolaaplicacin"HelloWorld"
7.1.CompilandoelCliente
7.2.CompilandoelServidor

7.3.EjecutandolaAplicacinCliente/Servidor
1.Introduccin
1.1.Aplicacionesdistribuidas
CORBAproprocionanunentornoparaeldesarrolloyejecucindeaplicacionesdistribuidas.Pero,porququeremosdistribuir
aplicaciones?.Ladisitribucindeaplicacionesintroduceunnuevoconjuntodedificultades.Sinembargo,algunavecesnohay
eleccinalgunasaplicaciones,porsunaturaleza,debenestardistribuidasatravsmultiplescomputadorasporalgunodeestos
motivos:

Laaplicacinutilizadatosdistribuidos.
Lacomputacinestdistribuida.
Losusuariosdelaaplicacinestndistribuidos.

1.1.1.Datosdistribuidos

Algunasaplicacionessedebenejecutarenvariosordenadoresporquelosdatosqueutilizalaaplicacinestnsituadosenmultiples
computadorasporcuestionesadministrativasodeseguridad.Elpropietariodebepermitirquesepuedaaccederaesosdatosde
formaremota.Quizslosdatosnopuedanestarsituadosenunmismoordenadorydebanestaresmltiplessistemasheterogneos
porrazoneshistricas.

1.1.2.Computacindistribuida

Algunasaplicacionesquerequierenmuchoclculoseejecutanenmltiplescomputadorasparaobtenerlaventajadepoder
ejecutarsedeformaparalelaenmltiplesprocesadores.Otrasaplicacionessepuedenejecutarenmltiplescomputadoraspara
aprovecharlascualidadesquenosbrindaunordenadorparticular.Lasaplicacionesdistribuidastienencomoventajalaescalabilidad
ylaheterogenidaddelossistemasdistribuidos.

1.1.3.Usuariosdistribuidos

Algunasaplicacionesseejecutanenmltiplescomputadoresporquelosusuariosdelaaplicacinsecomunicaneinteractanentres
mediantelapropiaaplicacin.Cadausuarioejecutaunapiezadelaaplicacindistribuidaensuordenador,ycomparteobjetosque
usanlosdemsusuariosdesdesusmquinas.Unaarquitecturatpicadeestetipodeaplicacionessemuestraacontinuacin:

1.2.RealidaddelosSistemasDistribuidos
Losdesarrolladoresdelossistemasdistribuidosdebentenerencuentaunaseriedecaractersticasquetienenencomnodiferencian
lossistemasdistribuidosdelossistemaslocales.Latablasiguienteindicadiferenciasquesepuedenencontrarentreobjetosqueestn
localizadosenunmismoproceso,yobjetosqueinteractanmsalldeloslmitesdeunprocesoounamquina:

Local Distribuido
Comuncacin Rpido Lento
Losobjetosfallanseparadamente
Fallos Losobjetosfallanconjuntamente
Laredpuedefallar
Accesoconcurrente Sloconmltiplesthreads Si
Seguro Si No

Lacomunicacinentreobjetosdeunmismoprocesoesvariosrdenesdemagnitudmsrpidaquelacomunicacinentreobjetos
endiferentesmquinas.Deestosedesprendequeustednodeberadisearaplicacionesdistribuidasenlascualesdosomsobjetos
distribuidosestnmuyntimamenterelacionados.Sihayesaestrecharelacin,dichosobjetosdeberansituarseenunmismolugaro
proceso.

Cuandodosobjetosestnlocalizadosconjuntamente,puedenfallaralavez.Sielprocesoquelosejecutafalla,ambosobjetos
fallarn.Eldiseadordebetenerencuentaestacaracterstica:siunobjetofalla,puedesaberqueelotroobjetotambinfallarsise
encuentranbajounmismoproceso,sinembargo,sielsistemaestdistribuidohabraquetenerencuentaquesiunobjetofalla,otro
objetopuedequenofalle.Estonosdaunatoleranciaafallossitenemoslosobjetosduplicadosporlared.Encasodequelared
falleenunpunto,losobjetosqueestnaambosladosdeesepuntoderupturapuedenseguirejecutndoseindependientemente
asumiendoquelosdelotroladohanfallado.

Elmodopordefectoparaprogramaraplicacioneslocalesesusarunslothreaddecontrol.Programarconunthreadesfcil.El
accesoalosobjetosessecuencialynohayquepreocuparseporaccesosconcurrentes.

Siusteddecideintroducirmltiplesthreadsdecontrolenunprogramalocal,debeconsiderarelordenenelqueseaccedealos
objetosyusarmecanismosdesincronizacinparacontrolarelaccesoconcurrentealosobjetoscompartidos.Peroporlomenos
tienelaposibilidaddeusarvariosthreads.Enaplicacionesdistribuidadhaynecesariamentemltiplesthreadsdecontrol.Cadaobjeto
distribuidooperaenunthreaddecontroldiferente.Unobjetodistribuidopuedetenermltiplesclientesconcurrentes.Como
desarrolladordeobjetosservidoresydeclientes,debeconsideraresteaccesoconcurrentealosobjetosyutilizarlosmecanismosde
sincronizacinnecesarios.

Cuandodosobjetosestnlocalizadoslocalmenteaunproceso,ustednonecesitatenerencuentalaseguridad.Sinembargo,cuando
losobjetosestnendiferentesmquinas,esnecesariousarmecanismosdeseguridadparaautentificarlaidentidaddelosotros
objetos.

1.3.SistemadeObjetosDistribuidos
Unsistemadeobjetosdistribuidosesunsistemadistribuidoenelquetodaslasentidadesestnmodeladascomoobjetos.Los
sistemasdeobjetosdistribuidossonunparadigmapopularparalasaplicacionesdistribuidasorientadasaobjeto.Dadoquela
aplicacinsemodelacomounconjuntodeobjetoscooperantes,semapeadeformanaturalalosserviciosdeunsistemadistribuido.

Teniendoencuentaelmapeonaturaldeunmodeloorientadoaobjetosasistemasdeobjetosdistribuidos,nohayqueolvidarlas
realidadesquesedanenlossistemasdistribuidos,comosedescribianteriormente.Loslmitesdelosprocesosimportanysedeben
tenerencuentaeneldiseo.

1.4.QuesCORBA?
CORBA(CommonObjectRequestBrokerArchitecture)esunaarquitecturaestandarparasistemasdeobjetossitribuidos.Permite
unacoleccindistribuidayheterogneadeobjetosqueinteroperanentres.

1.4.1.ElOMG

ElOMG(ObjectManagementGroup)eselresponsabledeladefinicindeCORBA.ElOMGesunconjuntodemsde700
compaasyorganizaciones,incluyendocasitodoslosmayoresvendedoresydesarrolladoresdetecnologasdeobjetosdistribuidos.

1.4.2.LaarquitecturaCORBA

CORBAdefineunaarqitecturaparaobjetosdistribuidos.ElparadigmabsicodeCORBAesquesehaceunapeticinparaobtener
unserviciodeunobjetodistribuido.TodolodemsdefinidoporelOMGestdescritoentrminosdeesteparadigmabsico.

Losserviciosqueproporcionaunobjetosondadosporsuinterfaz.LosinterfacessedefinenenelIDL(InterfaceDefinition
Language)delOMG.Losobjetosdistribuidosestnidentificadosporreferenciasaobjetos,lascualessedescribenmediantelos
interfacesIDL.

Lafiguradeabajomuestragrficamenteunapeticin.Unclientetieneunareferenciaaunobjetodistribuido.Larefenciaalobjeto
estdescritaporuninterface.Enlafigura,lareferenciaestsimbolizadaporelinterfaceRabbit.ElORB(ObjectRequestBroker),
entregalapeticinalobjetoydevuelveelresultadoalcliente.

1.4.3.ElORB

ElORBeselserviciodistribuidoqueimplementalapeticinalobjetoremoto.Localizaelobjetoremotoenlared,lecomunicala
peticin,esperaalosresultadosycuandoestndisponiblesselosdevuelvealcliente.

ElORBimplementatransparenciadelocalizacin.Seusaexactamenteelmismomecanismodepeticionestantoporelclientecomo
porelobjetoCORBA,sinimportardondeestlocalizado.Podratratarsedeunprocesoenelmismoordenadorqueelclienteo
estarsituadoaunosmetrosoinclusoalotroladodelplaneta.Elclientenonotarladiferencia.

ElORBimplementaindependenciadellenguajedeprogramacinparalaspeticiones.Elclientequelanzalapeticinsepuedeescribir
enunodelosdiferenteslenguajesqueaceptanobjetosCORBA.ElORBhacelasconversionesnecesariasentrelenguajesde
programacin.EstosenlacesconCORBAestndefinidosparaloslenguajesmspopulares.

1.4.4.CORBAcomounEstandarparaObjetosDistribuidos

UnodelosobjetivosdelaespecificacinCORBAesquelasimplementacionesdelosclientesyservidoresseanportables.La
especificacinCORBAdefineunAPI(ApplicationProgrammer'sInterface)paralosclientesdeobjetosdistribuidosascomoun
APIparalaimplementacindeunobjetoCORBA.EstosignificaqueelcdigoescritoporundesarolladorCORBApuede,conun
esfuerzomnimo,reescribirseparatrabajarconelproductodeotrodesarrollador.Sinembargo,larealidaddelosproductos
CORBAdelmercadodehoyesquelosclientesCORBAsonportables,perolasimplementacionesdelosobjetosnecesitanunpoco
deesfuerzoparaportarsedeunproductoCORBAaotro.

CORBA2.0aadilainteroperabilidadcomounobjetivoenlaespecificacin.Enparticular,CORBA2.0defineunprotocolode
redllamadoIIOP(InternetInterORBProtocol),quepermitealosclientesusarproductosCORBAdecualquierdesarrolladorque
secomuniquenconobjetosCORBAdecualquierotrodesarrollador.IIOPtrabajasobreInternet,omsexactamente,sobre
cualquierimplementacindeTCP/IP.

Lainteroperabilidadesmsimportanteenunsistemadistribuidoquelaportabilidad.IIOPseusaenotrossistemaqueinclusono
intentanproporcionarelAPIdeCORBA.Enparticular,IIOPseusarcomoprotocolodetransporteenunaversindeJavaRMI
(llamada"RMIoverIIOP").DadoqueEJBestdefinidoentrminosdeRMI,tambinpuedeusarIIOP.Variosservidoresde
aplicacionesdisponiblesenelmercadousanIIOP,peronoimplementanelAPIcompletodeCORBA.Dadoquetodosellosusan
IIOP,estoslosprogramaspuedeninteroperarconcualquierotroqueestescritoparaelAPIdeCORBA.
1.4.5.ServiciosCORBA

OtraparteimportantedelestandarCORBAesladefinicindeunconjuntodeserviciosdistribuidosparasoportarlaintegracine
interoperabilidaddelosobjetosdistribuidos.Comosemuestraenelgrficodeabajo,losservicios(conocidoscomoCORBA
ServicesoCOS)seencuentrandefinidosenlapartesuperiordelORB.Estoes,estndefinidoscomoobjetosCORBAestandar
coninterfacesIDL,algunasvecesllamados"ObjectServices."

ExistenvariosserviciosqueproporcionaCORBA.Losmspopularessedescribenbrevementeacontinuacin:

Servicio Descripcin
DefinecomolosobjetosCORBAsecrean,eliminan,
Ciclodevidadelobjeto
muevenycopian.
DefinecomolosobjetosCORBApuedentenernombres
Nominacin simblicosamigables.

Eventos Desacoplalacomunicacinentreobjetosdistribuidos.
Proporcionaunredarbitrariaderelacionesentreobjetos
Relaciones
CORBA.
CoordinalatransformacinentreobjetosCORBAay
Externalizacin
desdeelmedioextreno.
Transacciones CoordinaaccesosatmicosaobjetosCORBA.
Proporcionaunserviciodebloqueoparaobjetos
Controldeconcurrencia
CORBAqueaseguraaccesosserializables.
Soportalaasociacindeparesnombrevalorcon
Propiedad
objetosCORBA.
SoportalabsquedadeobjetosCORBAbasadosen
Negociacin propiedadesquedescribenelservicioofrecidopor
elobjeto.
Consultas Soportalasconsultasaobjetos.

1.4.6.ProductosCORBA

CORBAesunaespecificacinesunaguiaparaimprementarproductos.VarioscomerciantesproporcionanproductosCORBA
paravarioslenguajesdeprogramacin.LosproductosCORBAqueadmiteellenguajeJavaincluyen:

ORB Descripcin
VieneconelJava2SDKdeSun.Noimplementa
Java2ORB
algunasfuncionalidades.
UnORBparaJavamuypopulardeInpriseCorporation.
VisiBrokerforJava VisiBrokertambinlopodemosencontrarempotradoen
otrosproductos,comoenelNetscapeCommunicator.
OrbixWeb UnORBparaJavadeIonaTechnologies.
WebSphere UnservidordeaplicacionesconunORBdeIBM
ElNetscapetieneunaversindeVisiBrokerincrustada.
NetscapeCommunicator LosAppletspuedenhacerpeticionesaobjetosCORBA
sindescargarclasesORBenelnevegador.Yaestnah.
ExistenimplementacionesdeCORBAparavarioslenguajes
VariasORBslibresoshareware
quesepudendescargardealgunosservidores.

AcontinuacinveremoselprocesodedesarrollodeunaaplicacinCORBA.
2.ProcesodedesarrolloenJavaIDL
AhoraqueyahemosvistolarelacinentreelclienteyelservidorenCORBA,ustedestlistoparadarelgranpasohaciaelproceso
dediseoydesarrollodeobjetosdistribuidosconelJavaIDL.

2.1.DefinirelInterfazRemoto
UsteddefinelainterfazparaelobjetoremotousandoellenguajeparaladefinicindeinterfacesdelOMG.UsamosIDLenlugarde
Javaproqueelcompiladoridl2javaautomticamentegeneralosficherosdestubyskeletonenJavaapartirdeladefinicin
IDL,ascomotodalainfraestructuraparaconectarconelORB.Tambin,usandoIDL,ustedhaceposiblealosdesarrolladores
implementarclientesyservidoresencualquierotrolenguajecompatibleconCORBA.

NtesequesiustedestimplementandounclienteparaunservicioexistentedeCORBA,ounservidorparaunclienteyaexistente,
usteddeberacogerlosinterfacesIDLdelimplementador.Deberejecutarelcompiladoridl2javapasandocomoparmetroesos
interfaceseimplementarlosmtodosquenecesite.

2.2.CompilarelInterfazRemoto
CuandoustedejecutaelcompiladorIDLdeaJava(idl2java)conladefinicindelinterface,generaunaversinenJavadel
interface,ascomoelcdigodelasclasesdelosficherosdestubyskeletonquelepermitenengancharsuaplicacinalORB.

EstassonlosmapeosquesehacenentreconstructoresdeIDL,JavayC++:

IDL Java C++


module package namespace
interface interface abstractclass
operation method memberfunction
attribute pairofmethods pairofmethods
exception exception exception

YesteeselmapeoparalostiposdedatosentreIDLyJava:

IDL Java
boolean boolean
char/wchar char
octet byte
short/unsignedshort short
long/unsignedlong int

longlong/unsignedlonglong long
float float
double double
string/wstring String
2.3.ImplementarelServidor
Unavezejecutadoelcompiladoridl2java,ustedpuedeusarelesqueleto(skeleton)generadoparaimplementarlaaplicacin
servidora.Ademsdeimplementarlosmtodosdelinterfaceremoto,sucdigodelservidorincluyeunmecanismoparainicarel
ORByesperarunapeticindeunclienteremoto.

2.4.ImplementarelCliente
Deformasimilar,ustedusarlosstubsgeneradosporelcompiladoridl2javacomobaseparalaaplicacincliente.Elcdigodel
clienteiniciasuORB,buscaelservidorusandoelserviciodenombradoproporcionadoconJavaIDL,obtieneunareferenciaal
objetoremotoyllamaasumtodo.

2.5.Iniciarlasaplicaciones
Unavezqueestimplementadoelclienteyelservidor,ustedpuedeiniciarelserviciodenombrado,iniciarelservidoryporltimo
arrancarelcliente.

Unavezquesabemoslateora,pasemosacreaunejemploprctico.
3.Ejemplo"Helloworld"enCliente/Servidor
Construiremoseltpicoprogramadeejemploqueimprimelacadena"Hello world!!",peroenversincliente/servidorcon
CORBA.SetratardeunaaplicacindistribuidausandoelJavaIDL.Elprogramatieneunaslooperacinquedevuelveuna
cadena,lacualimprimir.Todoslosfundamentostericosquenecesitamosparacomprenderelejemployahansidoexpuestos
previamente.Estediagramamuestraelprocesodecomunicacinentreelclienteyelservidor,atravsdelIIOP:

Estossonlospasosquesellevaacabo:

1. ElclienteinvocalaoperacinsayHellodelservidorHelloServer.
2. ElORBtransfieredichainvocacinalobjetoservidorregistradoparaelinterfaceIDL.
3. ElmtodosayHellodelservidorseejecuta,devolviendounString.
4. ElORBtransfiereeseStringdevueltaalcliente.
5. ElclienteimprimeelvalordelStringobtenido.

Aunquetengaundiseomuysimple,esteprogramadeejemplolepermiteaprenderyexperimentarcontodaslastareasquese
requierenparadesarrollarcasicualquierprogramaenCORBAqueuseinvocacinesttica.

AntesdeempezaratrabajarconJavaIDL,ustednecesitadoscosas:laversin1.2delJDKyelcompiladoridl2java(de
VisiBrokerforJava).ElJDKproporcionaelAPIyelORBnecesariosparahabilitarlainteraccinentrelosobjetosdistribuidos
basadoenCORBA.Elcompiladoridl2javausaelmapeoIDL>JavaparaconvertirlasdefinicionesdeinterfacesescritasenIDL
alosinterfaces,clasesymtodoscorrespondientesenJava,queusaremosparaimplementarelcdigodelclienteydelservidor.

Estossonlospasos:

EscribirelinterfazIDL
EscribirelCliente
EscribirelServidor
CompilaryEjecutarlaaplicacin
4.EscribirelinterfazIDL
EnestaseccinescribiremosuninterfazIDLsimpleparaelprogramaHello World.ElinterfaceIDLdefineelcontratoentrelas
partesclienteyservidordesuaplicacin,especificandoquoperacionesyatributosestndisponibles.OMGIDLesindependiente
dellenguajedeprogramacin.UsteddebemapearloaJavaantesdeescribirelcdigoqueimplementelosservicios(elprograma
idl2javalohacedeformaautomtica).

4.1.EscribiendoHello.idl
OMGIDLesunlenguajepuramentedeclarativodiseadoparaespecificarinterfacesparaaplicacionesdistribuidasdeunaforma
independientedellenguaje.OMGespecificaunmapeodeIDLavarioslenguajesdeprogramacin,incluyendoC,C++,Smalltalk,
COBOL,AdayJava.Cuandosemapea,cadaordenenOMGIDLsetraduceasucorrespondienteordenenellenguajede
programacinelegido.Ustedpuedeusarlaherramientaidl2javaparamapearuninterfazenIDLaJavaeimplementarlaclasedel
cliente.CuandoustedmapeaelmismoIDLsobreC++eimplementaelservidoreneselenguaje,elclienteenJavayelservidoren
C++puedencomunicarseatravsdelORBcomosiestuvieranescritosenelmismolenguaje.

ElIDLparaHelloWorldesextremadamentesimplesunicointerfacetieneunanicaoperacin.Ustednecesitarealizarslolostres
pasosquesedescribenabajo:

4.1.1.DeclararelMduloIDLdeCORBA

UnmdulodeCORBAesunespaciodenombrequeactacomouncontenedorparalosinterfacesydeclaracionesasociados.Se
correspondeaunpaquetedeJava.CadamduloenunficheroIDLsemapeaaunpaquetedeJava.

LadeclaracindelmduloHelloAppsehaceas:

module HelloApp {
// Las dems lneas van aqu.
};

4.1.2.DeclararlaInterface

AscomolosinterfacesenJava,losinterfacesdeCORBAdeclaranelAPIqueusanlosobjetosparallamarseunosaotros.Cada
interfaceenIDLsemapeaconuninterfaceenJava.

EscribiremosenelficheroHello.idlelinterfaceHello:

module HelloApp {
interface Hello {
// Aqu irn las operaciones.
};
};

4.1.3.DeclarandolasOperaciones

LasoperacionesdeCORBAtienenelcomportamientoqueprometenlosservidoresrealizarcuandolosclienteslosinvocan.Este
compromisovieneindicadoenelIDL.CadasentenciadeoperacinenIDLgenerasucorrespondientesentenciademtodoenel
interfazgeneradodeJava.

IntroducimoslaoperacinenelficheroHello.idl:

module HelloApp {
interface Hello {
string sayHello(); // Aadimos esta lnea.
};
};

4.2.MapeandoHello.idldeIDLaJava
Laherramientaidl2javaleelosficherosOMGIDLycrealosficherosJavanecesarios.Pordefecto,elcomportamientodela
herramientaesgenerartantoelclientecomoelservidor(talcomonecesitamosparanuestroejemplo),simplementelepasamoscomo
parmentroelficheroIDLquehemoscreadoantes:

$ idl2java Hello.idl

Siustedlistaelcontenidodeldirectorio,verquesehacreadoundirectoriollamadoHelloApp,elcualcontienecincoficheros.El
contenidodelficheroHello.javaessimilaraesto:

/* Hello.java as generated by idltojava */


package HelloApp;
public interface Hello
extends org.omg.CORBA.Object {
String sayHello();
}

Conelinterfacetansimplequetenemos,esfcilcomprobarcmosehahechoelmapeoparagenerarelcdigoJavaapartirdel
IDL:

SentenciaIDL SentenciaJava
moduleHelloApp packageHelloApp
interfaceHello publicinterfaceHello
stringsayHello() StringsayHello()

Lanicasorpresaeslasentenciaextends.TodoslosobjetosCORBAderivandeorg.omg.CORBA.Objectparaasegurarseque
setienetodalafuncionalidadCORBA.

4.3.Comprendientolasalidadeidl2java
Elcompiladoridl2javageneraunaseriedeficheros,basndoseenlasopcionesquelepasamosenlalneadecomnados.Dado
queproporcionaunafuncionalidadpordefecto,ustedpuedeignorarestasopcionesporahora.Loscincoficherogeneradosson:

4.3.1._HelloImplBase.java

Estaclaseabstractaeselskeletondelservidor,proporcionandounafuncionalidadCORBAbsicaparaelservidor.Implementael
interfaceHello.java.LaclasedelservidorHelloServantheredade_HelloImplBase.

/*
* File: ./HelloApp/_HelloImplBase.java
* From: Hello.idl
* Date: Thu Jul 3 09:46:22 2000
* By: idltojava Java IDL 1.2 Jul 12 1997 12:23:47
*/

package HelloApp;
public abstract class _HelloImplBase extends org.omg.CORBA.DynamicImplementation
implements HelloApp.Hello {
// Constructor
public _HelloImplBase() {
super();
}
// Type strings for this class and its superclases
private static final String _type_ids[] = {
"IDL:HelloApp/Hello:1.0"
};

public String[] _ids() { return (String[]) _type_ids.clone(); }

private static java.util.Dictionary _methods = new java.util.Hashtable();


static {
_methods.put("sayHello", new java.lang.Integer(0));
}
// DSI Dispatch call
public void invoke(org.omg.CORBA.ServerRequest r) {
switch (((java.lang.Integer) _methods.get(r.op_name())).intValue()) {
case 0: // HelloApp.Hello.sayHello
{
org.omg.CORBA.NVList _list = _orb().create_list(0);
r.params(_list);
String ___result;
___result = this.sayHello();
org.omg.CORBA.Any __result = _orb().create_any();
__result.insert_string(___result);
r.result(__result);
}
break;
default:
throw new org.omg.CORBA.BAD_OPERATION(0,

org.omg.CORBA.CompletionStatus.COMPLETED_MAYBE);
}
}
}

4.3.2._HelloStub.java

Estaclaseeselstubdelcliente,proporcionandofuncionalidadCORBAalcliente.ImplementaelinterfaceHello.java.

/*
* File: ./HelloApp/_HelloStub.java
* From: Hello.idl
* Date: Thu Jul 3 09:46:22 2000
* By: idltojava Java IDL 1.2 Nov 12 1997 12:23:47
*/

package HelloApp;
public class _HelloStub
extends org.omg.CORBA.portable.ObjectImpl
implements HelloApp.Hello {

public _HelloStub(org.omg.CORBA.portable.Delegate d) {
super();
_set_delegate(d);
}

private static final String _type_ids[] = {


"IDL:HelloApp/Hello:1.0"
};

public String[] _ids() { return (String[]) _type_ids.clone(); }

// IDL operations
// Implementation of ::HelloApp::Hello::sayHello
public String sayHello() {
org.omg.CORBA.Request r = _request("sayHello");
r.set_return_type(org.omg.CORBA.ORB.init().get_primitive_tc(
org.omg.CORBA.TCKind.tk_string));
r.invoke();
String __result;
__result = r.return_value().extract_string();
return __result;
}
};

4.3.3.Hello.java

EsteinterfacecontienelaversinenJavadelinterfaceenIDL.ContieneunslomtodollamadosayHello.Elinterface
Hello.javaheredadeorg.omg.CORBA.Object,proporcionandotambinunafuncionalidadCORBAestndar.

/*
* File: ./HelloApp/Hello.java
* From: Hello.idl
* Date: Thu Jul 3 09:46:22 2000
* By: idltojava Java IDL 1.2 Nov 12 1997 12:23:47
*/

package HelloApp;
public interface Hello
extends org.omg.CORBA.Object {
String sayHello();
}

4.3.4.HelloHelper.java

Estaltimaclaseproporcionaunafuncionalidadauxiliar,msquenadaelpequeomtodonecesarioparahacerlaconversindela
referenciaalobjetoCORBAasustiposadecuados.

/*
* File: ./HelloApp/HelloHelper.java
* From: Hello.idl
* Date: Thu Jul 3 09:46:22 2000
* By: idltojava Java IDL 1.2 Nov 12 1997 12:23:47
*/

package HelloApp;
public class HelloHelper {
// It is useless to have instances of this class
private HelloHelper() { }

public static void write(org.omg.CORBA.portable.OutputStream out, HelloApp.Hello that)


{
out.write_Object(that);
}
public static HelloApp.Hello read(org.omg.CORBA.portable.InputStream in) {
return HelloApp.HelloHelper.narrow(in.read_Object());
}
public static HelloApp.Hello extract(org.omg.CORBA.Any a) {
org.omg.CORBA.portable.InputStream in = a.create_input_stream();
return read(in);
}
public static void insert(org.omg.CORBA.Any a, HelloApp.Hello that) {
org.omg.CORBA.portable.OutputStream out = a.create_output_stream();
write(out, that);
a.read_value(out.create_input_stream(), type());
}
private static org.omg.CORBA.TypeCode _tc;
synchronized public static org.omg.CORBA.TypeCode type() {
if (_tc == null)
_tc = org.omg.CORBA.ORB.init().create_interface_tc(id(), "Hello");
return _tc;
}
public static String id() {
return "IDL:HelloApp/Hello:1.0";
}
public static HelloApp.Hello narrow(org.omg.CORBA.Object that)
throws org.omg.CORBA.BAD_PARAM {
if (that == null)
return null;
if (that instanceof HelloApp.Hello)
return (HelloApp.Hello) that;
if (!that._is_a(id())) {
throw new org.omg.CORBA.BAD_PARAM();
}
org.omg.CORBA.portable.Delegate dup =
((org.omg.CORBA.portable.ObjectImpl)that)._get_delegate();
HelloApp.Hello result = new HelloApp._HelloStub(dup);
return result;
}
}

4.3.5.HelloHolder.java

EstaltimaclasecontieneunmiembrodeinstanciapblicadeltipoHello.Proporcionalasoperacionesparatrabajarconlos
argumentosquetieneCORBAparenosepuedenmapearfcilmenteenlasemnticadeJava:

/*
* File: ./HelloApp/HelloHolder.java
* From: Hello.idl
* Date: Thu Jul 3 09:46:22 2000
* By: idltojava Java IDL 1.2 Nov 12 1997 12:23:47
*/

package HelloApp;
public final class HelloHolder
implements org.omg.CORBA.portable.Streamable{
// instance variable
public HelloApp.Hello value;
// constructors
public HelloHolder() {
this(null);
}
public HelloHolder(HelloApp.Hello __arg) {
value = __arg;
}

public void _write(org.omg.CORBA.portable.OutputStream out) {


HelloApp.HelloHelper.write(out, value);
}

public void _read(org.omg.CORBA.portable.InputStream in) {


value = HelloApp.HelloHelper.read(in);
}

public org.omg.CORBA.TypeCode _type() {


return HelloApp.HelloHelper.type();
}
}

CuandoustedescribeuninterfaceIDL,ustedyahacetodoeltrabajoparagenerartodosestosficherosnecesariosparasu
aplicacindistribuida.Elnicotrabajoadicionalquedebehaceresimplementarlafuncionalidaddelclienteydelservidor.Estoeslo
queveremosenlossiguientescaptulos.

5.DesarrollodelCliente
EnestaseccinveremoscomodarunafuncionalidadaunaaplicacinclienteenCORBA.

5.1.Realizarunaconfiguracinbsica
ElcascarnbsicodeunclienteCORBAeselmismoquemuchasaplicacionesJava:seimportanlospaquetesrequeridos,
declaramoslaclasedelaaplicacin,definimoselmtodomainyprocuramosmanejarcualquierexcepcin.

5.1.1.Importandolospaquetesrequeridos

VamosacrearunnuevoficherollamadoHelloClient.javaeneldirectoriodelproyecto.Importaremoslospaquetesnecesarios:

import HelloApp.*; // El paquete que contienes nuestros stubs.


import org.omg.CosNaming.*; // HelloClient usar el servicio de nombrado.
import org.omg.CORBA.*; // Necesario para todas las aplicaciones CORBA.

5.1.2.Declarandolaclasedelcliente

EnelficheroHelloClient.java,declaramoslaclasedelcliente:

public class HelloClient {


// Aqu ir el mtodo main.
}

5.1.3.Definiendoelmtodomain

CadaaplicacinJavanecesitaunmtodomain.DeclremosdentrodelaclaseHelloClient:

public static void main(String args[]) {


// Ponga aqu el bloque try-catch.
}

5.1.4.ManejandolasexcepcionesCORBA

DadoquetodoslosprogramasCORBApuedenlanzarexcepcionesdelsistemaCORBAentiempodeejecucin,usteddebe
englobartodalafuncionalidadprincipaldentrodeunbloquetry-catch.LosprogramasCORBAlanzanexcepcionessiempreque
ocurreunproblemadurantealgunodelosprocesosinvolucradosenlainvocacindelservidorporpartedelcliente.

Nuestromanejadordeexcepcionessimplementeimprimeelnombredelaexcepcinylatrazadelapilaporlasalidaestandar,as
podrverqucosashanidomal.

Dentrodelmain,pondremoselbloquetry-catch:

try {
// Aada el resto del cdigo del cliente aqu.
} catch(Exception e) {
System.out.println("ERROR : " + e);
e.printStackTrace(System.out);
}

5.2.CrearunobjetoORB
UnclienteCORBAnecesitaunobjetoORBlocalpararealizartodoeltrabajodeconversindedatosycomunicacin.Cadacliente
instanciaunobjetoorg.omg.CORBA.ORByloinicializapasndoleciertainformacinsobresmismo.

EnelficheroHelloClient.java,dentrodelbloquetry-catch,declaramoseinicializamosunavariableORB:

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

LallamadaalmtodoinitdelORBlepasalosargumentosdelalneadecomando,permitindoleestablecerciertaspropiedades
entiempodeejecucin.

5.3.EncontrarelServidorHello
UnavezquelaaplicacintieneunORB,puedepreguntaralORBparalocalizarelservicioquenecesita,queennuestrocasoesel
servidorHello.UnclienteCORBAtienevariasformasdeobtenerunareferenciainicialnuestraaplicacinclienteusarelCOS
Naming ServiceespecificadoporOMGyproporcionadoporJavaIDL.

5.3.1.ObtenerelContextoInicialdeNombrado

ElprimerpasoquehayquedarparausarelServiciodeNombrado(NamingService)esobtenerelcontextoinicialdenombrado.En
elbloquetry-catch,bajolainicializacindelORB,llamaremosaorb.resolve_initial_referencesparaobteneruna
referenciaaunobjetodelservidordenombres:

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

Lacadena"NameService"estdefinidaparatodoslosORBsdeCORBA.Cuandoustedpasaesacadena,elORBdevuelveel
contextoinicialdenombrado,unareferenciaaunobjetodelservidordenombres.

5.3.2.AjustarlaReferenciaaObjeto

ComocontodoslasreferenciasaobjetosCORBA,objRefesunobjetoCORBAgenrico.Parausarlocomounobjeto
NamingContext(ContextodeNombrado),usteddebeajustarloasutipoadecuado.Aadalallamadaparaajustarlodebajodela
sentenciaanterior:

NamingContext ncRef = NamingContextHelper.narrow(objRef);

Aquvemoselusodeunaclasedeayudageneradaporidl2java,similarensufuncinaHelloHelper.ElobjetoncRefesahora
deltipoorg.omg.CosNaming.NamingContextyustedpuedeusarloparaaccederalserviciodenombradoyencontrarotros
servicios.Esoloharemosenelsiguientepaso.

5.3.3.EncontrarunServiciodeNombrado

Losnombrespuedentenerdiferentesestructurasdependiendodelaimplementacindelserviciodenombrado.Consecuentemente,
losservidoresdenombresdeCORBAmanejannombrescomplejosenformadeobjetosNameComponent.CadaNameComponent
tieneunasolaparte,oelemento,delnombre.UnvectordeobjetosNameComponentpuedenalbergaruncaminoaunobjeto
completamenteespecificado,yaseaenunficherooenundiscodelsistema.

ParaencontrarelservidorHello,ustednecesitaunNameComponentparaalmacenarunacadenaidentificativaparaelservidor
Hello.Aadaestecdigodirectamentedebajodelallamadadeajuste:

NameComponent nc = new NameComponent("Hello", "");

Estainstruccinestableceelcampodeidentificacindenc,elnuevoNameComponent,a"Hello"yelcampodetipoaunacadea
vaca.
DadoqueelcaminoalobjetoHellotieneslounelemento,crearemosunvectordeunsloelementodenc.Elmtodo
NamingContext.resolvenecesitaestevectorparasutrabajo:

NameComponent path[] = {nc};

Finalmente,pasamoselcaminoalmtododeresolucindelserviciodenombresparaobtenerunareferenciaalservidorHelloy
ajustarloaunobjetoHello:

Hello helloRef = HelloHelper.narrow(ncRef.resolve(path));

AqupodemosverlaclasedeayudaHelloHelpertrabajando.ElmtododeresolucindevuelveunobjetoCORBAgenrico
comoustedviomsarribacuandolocalizbamoselserviciodenombrado.Portanto,ustedloajustaaunobjetoHello,queesel
objetoreferenciadoquenecesitamosparaefectuarelrestodeltrabajo.

5.4.InvocandolaOperacinsayHello
LasinvocacionesenCORBAseparecenaunallamadaaunobjetolocal.Lascomplicacionesdeajustedetiposdedatos
(marshalingyunmarshaling),ruteoydemssoncompletamentetransparentesalprogramadordelcliente.Dadoqueyahaymucho
hechoporelcdigogenerado,lainvocacinesrealmentelapartemsfcildelaprogramacinenCORBA.

Continuandoenelcloquetry-catchdelficheroHelloClient.java,introduzcalasiguienteinvocacindebajodelaresolucin
delnombredelservicio:

String hello = helloRef.sayHello();

Finalmente,aadacdigoparaimprimirelresultadodelainvocacinalasalidaestandar:

System.out.println(hello);

ElficheroHelloClient.javacompletoeselsiguiente:

import HelloApp.*; // El paquete que contienes nuestros stubs.


import org.omg.CosNaming.*; // HelloClient usar el servicio de nombrado.
import org.omg.CORBA.*; // HelloClient usar el servicio de nombrado.

public class HelloClient


{
public static void main(String args[])
{
try{

// Crea e inicializa el ORB


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

// Obtiene el contexto de nombrado raiz


org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
NamingContext ncRef = NamingContextHelper.narrow(objRef);

// Resuelve la referencia al objeto en el nombrado


NameComponent nc = new NameComponent("Hello", "");
NameComponent path[] = {nc};
Hello helloRef = HelloHelper.narrow(ncRef.resolve(path));

// Llama al objeto servidor Hello e imprime el resultado


String hello = helloRef.sayHello();
System.out.println(hello);
} catch(Exception e) {
System.out.println("ERROR : " + e);
e.printStackTrace(System.out);
}
}
}

Ahorayapuedeescribirelcdigodelservidor.

6.DesarrollodelServidor
AhoranostocaimplementarelservidorHelloServer.java.

6.1.Realizandounaconfiguracinbsica
LaestructuradeunprogramaservidorenCORBAeslamismaquelademuchasaplicacionesenJava:ustedimportalospaquetes
necesarios,declaralaclaseservidora,defineelmtodomainymanejacualquierexcepcinqueocurra.

6.1.1.Importandolospaquetesrequeridos

CrearemosunficherollamadoHelloServer.java.Luegoimportaremoslospaquetesnecesariosparaestaclase:

import HelloApp.*; // El paquete que contienes nuestros stubs.


import org.omg.CosNaming.*; // HelloServer usar el servicio de nombrado.
import org.omg.CosNaming.NamingContextPackage.*; // Excepciones especiales.
import org.omg.CORBA.*; // Necesario para todas las aplicaciones CORBA.

6.1.2.Declarandolaclasedelservidor

Declaramoslaclasedelservidor:

public class HelloServer {


// Aqu ir el mtodo main.
}

6.1.3.Definiendoelmtodomain

Declaramosunmtodomainestndar:

public static void main(String args[]) {


// Ponga aqu el bloque try-catch.
}

6.1.4.ManejandolasexcepcionesCORBA

DadoquetodoprogramaCORBApuedelanzarexcepcionesentiempodeejecucin,usteddebeponertodalafuncionalidad
principaldentrodeunbloquetry-catch.LosprogramasCORBAlanzanexcepcionesentiempodeejecucincuandoocurrealgn
problemadurantealgunodelosprocesosquesellevanacabodurantelainvocacindeservicioremoto(marshaling,unmarshaling,
upcall).Elmanejadordeexcepcionessimplementeimprimelaexcepcinylatrazadelapila.Deestaformapodremossaberqu
cosahaidomal.

Dentrodelbloquetry-catchescribiremos:

try {
// Aada el resto del cdigo del servidor aqu.
} catch(Exception e) {
System.err.println("ERROR: " + e);
e.printStackTrace(System.out);
}

6.2.CrearunobjetoORB
Comouncliente,unservidorCORBAtambinnecesitaunobjetoORBlocal.CadaservidorinstanciaunORByregistasusobjetos
sirvientesparaqueelORBpuedaencontrarelseridorcuandorecibeunapeticinparal.

EnelficheroHelloServer.java,dentrodelbloquetry-catch,declaramoseinicializamoslavariableORB:

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

LallamadaalmtodoinitdelORBlepasalosargumentosdelalneadecomando,permitindoleestablecerciertaspropiedadesen
tiempodeejecucin.

6.3.AdministrandoelObjetoSirviente
Unservidoresunprocesoqueinstanciaunoovariosobjetossirvientes.Elsirvienteimplementalainterfacegeneradaporelprograma
idl2javayrealizaeltrabajodelinterface.NuestroHelloServernecesitaunHelloServant.

6.3.1.InstanciandoelObjetoSirviente

Dentrodelbloquetry-catch,justodebajodelallamadaainit,instanciaremoselobjetosirviente:

HelloServant helloRef = new HelloServant();

Estaclasesirvientenoestdefinidaanloharemosenelsiguientepaso.SeguidamenteconectaremoselsirvientealORB,paraque
elORBpuedareconocerlasllamadasasteyenviarlasalsirvientecorrecto:

orb.connect(helloRef);

6.3.2.DefiniendolaClaseSirviente

AlfinaldeHelloServer.java,fueradelaclaseHelloServer,definalaclaseparaelobjetosirviente.Paraellodeclaramosla
clase:

class HelloServant extends _HelloImplBase {


// Aada aqu el mtodo sayHello.
}

Elsirvienteesunasubclasede_HelloImplBaseasqueheredalafuncionalidadgeneralCORBAgeneradaporelcompilador.
DeclareelmtodosayHello:

public String sayHello() {


// Aada aqu la implementacin del mtodo.
}

Yescribimoslaimplementacindelmtodo:

return "\nHello World!!\n";

ElficheroHelloServer.javacompletoeselsiguiente:

import HelloApp.*; // El paquete que contienes nuestros stubs.


import org.omg.CosNaming.*; // HelloServer usar el servicio de nombrado.
import org.omg.CosNaming.NamingContextPackage.*; // Excepciones especiales.
import org.omg.CORBA.*; // Necesario para todas las aplicaciones CORBA.

public class HelloServer {


public static void main(String args[]) {
try{
// Crea e inicializa el ORB
ORB orb = ORB.init(args, null);

// Crea al sriviente y lo registra con el ORB


HelloServant helloRef = new HelloServant();
orb.connect(helloRef);

// Obtiene el contexto de nombrado raiz


org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
NamingContext ncRef = NamingContextHelper.narrow(objRef);

// Liga el objeto al nombrado


NameComponent nc = new NameComponent("Hello", "");
NameComponent path[] = {nc};
ncRef.rebind(path, helloRef);

// Espera a peticiones de los clientes


java.lang.Object sync = new java.lang.Object();
synchronized(sync){
sync.wait();
}
} catch(Exception e) {
System.err.println("ERROR: " + e);
e.printStackTrace(System.out);
}
}
}

class HelloServant extends _HelloImplBase {


public String sayHello() {
return "\nHello world!!\n";
}
}

6.4.TrabajandoconelNombramientoCOS
ElservidorHelloServertrabajaconelserviciodenombramientoparahacerdisponibleslasoperacionesdelsirvientealosclientes.
Elservidornecesitaunareferenciaalnombredelservicio,demaneraquepuedaregistrarloyasegurarsequelaspeticionesdel
interfaceHellosondirigidasasuobjetosirviente.

6.4.1.ObteniendoelContextoInicialdeNombramiento

Enelbloquetry-catch,bajolainstanciacindelsirviente,llamaremosaorb.resolve_initial_referencesparaobteneruna
referenciaalserviciodenombres:

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

LacadenaNameServiceestdefinidaparatodoslosORBsdeCORBA.Cuandoustedpasaesacadena,elORBdevuelveun
contextodenombramientoqueesunareferenciaalserviciodenombres.

6.4.2.AjustandolaReferenciaaObjeto

ComocontodoslasreferenciasaobjetosCORBA,objRefesunobjetoCORBAgenrico.Parausarlocomounobjeto
NamingContext(ContextodeNombrado),usteddebeajustarloasutipoadecuado.Aadalallamadaparaajustarlojustamente
debajodelasentenciaanterior:
NamingContext ncRef = NamingContextHelper.narrow(objRef);

Aquvemoselusodeunaclasedeayudageneradaporidl2java,similarensufuncinaHelloHelper.ElobjetoncRefesahora
del
tipoorg.omg.CosNaming.NamingContextyustedpuedeusarloparaaccederalserviciodenombradoyencontrarotros
servicios.
Esoloharemosenelsiguientepaso.

6.4.3.RegistrarelSirvienteenelServidordeNombres

Justodebajodellamadaalajuste,creeunnuevomiembroNameComponent:

NameComponent nc = new NameComponent("Hello", "");

Estainstruccinestableceelcampodeidentificacindenc,elnuevoNameComponent,a"Hello"yelcampodetipoaunacadea
vaca.DadoqueelcaminoalobjetoHellotieneslounelemento,crearemosunvectordeunsloelementodenc.Elmtodo
NamingContext.resolvenecesitaestevectorparasutrabajo:

NameComponent path[] = {nc};

Finalmente,pasamoselcaminoyelobjetosirvientealserviciodenombramiento,ligandoelobjetosirvientealidentificador"Hello":

ncRef.rebind(path, helloRef);

Ahora,cuandoelclientellamaaresolve("Hello")enelcontextoinicialdenombramiento,elserviciodenombramientodevuelve
unreferenciaalobjetosirvienteHello.

6.5.Esperandoalapeticin
Elservidorestpreparadosimplementenecesitaesperaraunapeticindelcliente.Parahaceresto,introduzcaelsiguientecdigoal
finaldelbloquetry-catch:

java.lang.Object sync = new java.lang.Object();


synchronized(sync) {
sync.wait();
}

EstaformadeObject.waithacequeHelloServerpermanezcavivo(aunqueincativo)hastaquevengaunapeticindelORB.
Comoestoestenelmain,depusdequesecompleteysayHellotermine,elservidoresperarotravez.

Unavezquetenemostodoescrito,pasemosacompilarloyprobarlo.
7.Compilandoyejecutandolaaplicacin"HelloWorld"
Estaseccinmuestracomocompilaryejecutartantoelservidorcomoelclientequeconjuntamenteformanlaaplicacin"Hello
World".

7.1.CompilandoelCliente
CompilamoselficheroHelloClient.java:

$ javac HelloClient.java HelloApp/*.java

DeberaaparecerelficheroHelloClient.classeneldirectoriodelproyecto.

7.2.CompilandoelServidor
CompilamoselficheroHelloServer.java:

$ javac HelloServer.java HelloApp/*.java

DeberanaparecerlosficherosHelloServer.classyHelloServant.class.

7.3.EjecutandolaAplicacinCliente/Servidor
Desdeunaterminal,iniciamoselservidordenombresdeJavaIDL:

$ tnameserv -ORBInitialPort nameserverport

Ntesequenameserverporteselpuertodondecorrerelservidordenombres.Siustednoespecificaestepuerto,pordefectose
elegirel900.SiestamosenUnixhayquetenerencuentaqueslorootpuedeejecutarunprocesoenunpuertomenorque1024.
Porestarazn,recomendamosqueseelijaunpuertosuperiora1024.

DesdeunasegunaterminaliniciamoselservidordeHello:

$ java HelloServer -ORBInitialHost nameserverhost


-ORBInitialPort nameserverport

NtesequenameserverhosteselhostdondeelservidordenombresIDLestejecutndose.Ustedpuedeomitir-
ORBInitialHost nameserverhostsielservidordenombresestejecutndoseenlamismamquinaqueelservidordeHello.
Tambinpuedeomitir-ORBInitialPort nameserverportsielservidordenombresseestejecutandoenelpuertoasignado
pordefecto.

DesdeunaterceraterminalejecutamoselclientedeHello:

$ java HelloClient -ORBInitialHost nameserverhost


-ORBInitialPort nameserverport

NtesequenameserverhosteselhostdondeelservidordenombresIDLestejecutndose.Ustedpuedeomitir-
ORBInitialHost nameserverhostsielservidordenombresestejecutndoseenlamismamquinaqueelclientedeHello.
Tambinpuedeomitir-ORBInitialPort nameserverportsielservidordenombresseestejecutandoenelpuertoasignado
pordefecto.

Elclienteimprimelacadenaqueleenvaelservidor:
Hello world!!

RecuerdeparartantoelprocesotnameservcomoHelloServerdespusdequeelclienteterminesatisfactoriamente.

Bien,yaesustedunexpertoenprogramacinCORBAenlenguajeJava.Ahoradebeprobartodascosasqueseleocurra,
complicandoesteejemploinicial.Suerte!!!

Vous aimerez peut-être aussi