|
马上注册,结交更多好友,享用更多功能,让你轻松玩转社区。
您需要 登录 才可以下载或查看,没有帐号?立即注册
x
ruby里有这些工具吗?又要简单多少?我没有用过这两门语言,我估计在这些语言力没有很统一的这种标准,或者根本就没有提供。
这儿显现的代码大概其实不细致,由于分歧的ORB有分歧的办法来会见CORBA服务,以是不管甚么例子都要取决于详细的厂商(下例利用了JavaIDL,这是Sun公司的一个收费产物。它配套供应了一个简化版本的ORB、一个定名服务和一个“IDL→Java”编译器)。除此以外,因为Java仍处在开展早期,以是在分歧的Java/CORBA产物里并非包括了一切CORBA特征。
我们但愿完成一个服务器,令其在一些呆板上运转,其他呆板能向它查询准确的工夫。我们也但愿完成一个客户,令其哀求准确的工夫。在这类情形下,我们让两个程序都用Java完成。但在实践使用中,常常分离接纳分歧的言语。
1.编写IDL源码
第一步是为供应的服务编写一个IDL形貌。这一般是由服务器程序员完成的。随后,程序员便可用任何言语完成服务器,只需那种言语里存在着一个CORBAIDL编译器。
IDL文件已分发给客户真个程序员,并成为两种言语间的桥梁。
上面这个例子展现了工夫服务器的IDL形貌情形:- moduleRemoteTime{
- interfaceExactTime{
- stringgetTime();
- };
- };
复制代码
这是对RemoteTime定名空间内的ExactTime接口的一个声明。该接口由独自一个办法组成,它以字串格局前往以后工夫。
2.创立根干
第二步是编译IDL,创立Java根干代码。我们将使用这些代码完成客户和服务器。与JavaIDL产物配套供应的工具是idltojava:
idltojava-fserver-fclientRemoteTime.idl
个中两个标志告知idltojava同时为根和干天生代码。idltojava会天生一个Java包,它在IDL模块、RemoteTime和天生的Java文件置进RemoteTime子目次后定名。_ExactTimeImplBase.java代表我们用于完成服务器对象的“干”;而_ExactTimeStub.java将用于客户。在ExactTime.java中,用Java体例暗示了IDL接口。别的还包括了用到的其他撑持文件,比方用于简化会见定名服务的文件。
3.完成服务器和客户
人人鄙人面看到的是服务器端利用的代码。服务器对象是在ExactTimeServer类里完成的。RemoteTimeServer这个使用的感化是:创立一个服务器对象,经由过程ORB为其注册,指定对象援用时接纳的称号,然后“宁静”地期待客户收回哀求。- importRemoteTime.*;
- importorg.omg.CosNaming.*;
- importorg.omg.CosNaming.NamingContextPackage.*;
- importorg.omg.CORBA.*;
- importjava.util.*;
- importjava.text.*;
- //Serverobjectimplementation
- classExactTimeServerextends_ExactTimeImplBase{
- publicStringgetTime(){
- returnDateFormat.
- getTimeInstance(DateFormat.FULL).
- format(newDate(
- System.currentTimeMillis()));
- }
- }
- //Remoteapplicationimplementation
- publicclassRemoteTimeServer{
- publicstaticvoidmain(Stringargs[]){
- try{
- //ORBcreationandinitialization:
- ORBorb=ORB.init(args,null);
- //Createtheserverobjectandregisterit:
- ExactTimeServertimeServerObjRef=
- newExactTimeServer();
- orb.connect(timeServerObjRef);
- //Gettherootnamingcontext:
- org.omg.CORBA.ObjectobjRef=
- orb.resolve_initial_references(
- "NameService");
- NamingContextncRef=
- NamingContextHelper.narrow(objRef);
- //Assignastringnametothe
- //objectreference(binding):
- NameComponentnc=
- newNameComponent("ExactTime","");
- NameComponentpath[]={nc};
- ncRef.rebind(path,timeServerObjRef);
- //Waitforclientrequests:
- java.lang.Objectsync=
- newjava.lang.Object();
- synchronized(sync){
- sync.wait();
- }
- }
- catch(Exceptione){
- System.out.println(
- "RemoteTimeservererror:"+e);
- e.printStackTrace(System.out);
- }
- }
- }
复制代码
正如人人看到的那样,服务器对象的完成长短常复杂的;它是一个一般的Java类,从IDL编译器天生的“干”代码中承继而来。但在与ORB和其他CORBA服务举行接洽的时分,情形却变得略微有些庞大。
4.一些CORBA服务
这里要复杂先容一下JavaIDL相干代码所做的事情(注重临时疏忽了CORBA代码与分歧厂商有关这一现实)。main()的第一行代码用于启动ORB。并且天经地义,这恰是服务器对象必要同它举行相同的缘故原由。就在ORB初始化今后,紧接着就创立了一个服务器对象。实践上,它正式称号应当是“短时间服务对象”:从客户那边吸收哀求,“保存工夫”与创立它的历程是不异的。创立好短时间服务对象后,就会经由过程ORB对其举行注册。这意味着ORB已晓得它的存在,可将哀求转发给它。
到今朝为止,我们具有的全体工具就是一个timeServerObjRef——只要在以后服务器历程里才无效的一个对象援用。下一步是为这个服务对象分派一个字串情势的名字。客户会依据谁人名字寻觅服务对象。我们经由过程定名服务(NamingService)完成这一操纵。起首,我们必要对定名服务的一个对象援用。经由过程挪用resolve_initial_references(),可取得对定名服务的字串式对象援用(在JavaIDL中是“NameService”),并将这个援用前往。这是对接纳narrow()办法的一个特定NamingContext援用的模子。我们如今可入手下手利用定名服务了。
为了将服务对象统一个字串情势的对象援用绑定在一同,我们起首创立一个NameComponent对象,用“ExactTime”举行初始化。“ExactTime”是我们想用于绑定服务对象的称号字串。随后利用rebind()办法,这是受限于对象援用的字串化援用。我们用rebind()分派一个援用——即便它已存在。而倘使援用已存在,那末bind()会形成一个非常。在CORBA中,称号由一系列NameContext组成——这即是我们为何要用一个数组将称号与对象援用绑定起来的缘故原由。
服务对象最好筹办好由客户利用。此时,服务器历程会进进一种期待形态。一样地,因为它是一种“短时间服务”,以是保存工夫要受服务器历程的限定。JavaIDL今朝还没有供应对“耐久对象”(只需创立它们的历程坚持运转形态,对象就会一向存鄙人往)的撑持。
如今,我们已对服务器代码的事情有了必定的熟悉。接上去看看客户代码:- importRemoteTime.*;
- importorg.omg.CosNaming.*;
- importorg.omg.CORBA.*;
- publicclassRemoteTimeClient{
- publicstaticvoidmain(Stringargs[]){
- try{
- //ORBcreationandinitialization:
- ORBorb=ORB.init(args,null);
- //Gettherootnamingcontext:
- org.omg.CORBA.ObjectobjRef=
- orb.resolve_initial_references(
- "NameService");
- NamingContextncRef=
- NamingContextHelper.narrow(objRef);
- //Get(resolve)thestringifiedobject
- //referenceforthetimeserver:
- NameComponentnc=
- newNameComponent("ExactTime","");
- NameComponentpath[]={nc};
- ExactTimetimeObjRef=
- ExactTimeHelper.narrow(
- ncRef.resolve(path));
- //Makerequeststotheserverobject:
- StringexactTime=timeObjRef.getTime();
- System.out.println(exactTime);
- }catch(Exceptione){
- System.out.println(
- "RemoteTimeservererror:"+e);
- e.printStackTrace(System.out);
- }
- }
- }
复制代码
前几行所做的事情与它们在服务器历程里是一样的:ORB取得初始化,并剖析出对定名服务的一个援用。
接上去,我们必要用到服务对象的一个对象援用,以是将字串情势的对象援用间接传送给resolve()办法,并用narrow()办法将了局外型到ExactTime接口援用里。最初挪用getTime()。
5.激活称号服务历程
如今,我们已分离取得了一个服务器和一个客户使用,它们已作好互相间举行相同的筹办。人人晓得二者都必要使用定名服务绑定息争析字串情势的对象援用。在运转服务大概客户之前,我们必需启动定名服务历程。在JavaIDL中,定名服务属于一个Java使用,是随产物配套供应的。但它大概与其他产物有所分歧。JavaIDL定名服务在JVM的一个实例里运转,并(默许)监督收集端口900。
6.激活服务器与客户
如今,我们已筹办好启动服务器和客户使用(之以是按这一按次,是因为服务器的存在是“短时间”的)。若各个方面都设置无误,那末取得的就是在客户把持台窗口内的一行输入笔墨,提示我们以后的工夫是几。固然,这一了局自己并没有甚么使人镇静的。但应注重一个成绩:即便都处在统一台呆板上,客户和服务器使用仍旧运转于分歧的假造机内。它们之间的通讯是经由过程一个基础的集成层举行的——即ORB与定名服务的集成。
这只是一个复杂的例子,面向非收集情况计划。但一般将ORB设置成“与地位有关”。若服务器与客户分离位于分歧的呆板上,那末ORB可用一个名为“安装库”(ImplementationRepository)的组件剖析出远程字串式援用。只管“安装库”属于CORBA的一部分,但它几近没有详细的规格,以是各厂商的完成体例是不尽不异的。
正如人人看到的那样,CORBA另有很多方面的成绩未在这儿举行具体报告。但经由过程以上的先容,应已对其有一个基础的熟悉。若想取得CORBA更具体的材料,最传真的出发点莫过于OMBWeb站点,地点是http://www.omg.org。这个中央供应了丰厚的文档材料、白页、程序和对其他CORBA资本和产物的链接。
java比较简单,没有C++的烦琐,但学习时最好有C++为基础.与JSP和SQL起应用,功能强大. |
|