IDE:Eclipse 3.4.1
先在Eclipse建立两个Java Project
1.然后定义 IDL .
内容如下:
module helloapp { interface Hello { string sayHello(); oneway void shutdown(); }; };
**这里注意, } 后面的 ";"一定要写上,不然会编译错误
2. 右键这个HelloApp.idl文件
点击,Change to parent folder in Shell
点击OK , Eclipse会打开Shell视图,是命令行视图,其实和CMD是一个作用.
这里我们执行命令 : idlj -fall HellApp.idl
3. 然后我们到项目目录(H:\DEVELOPING\UMM\workspace\testCorbaServer\src\server)下就能看到多生成了一个文件夹 -- helloapp
打开里面试一些java接口类
4.在服务端建立一个package 名字跟 idl内容里的module相同,这里我们是 ' helloapp '
然后把类复制到这个包下面
---------------------------------------
---------------------------------------
第二部分 实现IDL生成的类的接口
1.实现服务端 如图
内容如下:
package server; import org.omg.CORBA.ORB; import helloapp.HelloPOA; public class HelloImpl extends HelloPOA { private ORB orb; public void setOrb(ORB orb) { this.orb = orb; } @Override public String sayHello() { return "\nHello World!!\n"; } @Override public void shutdown() { orb.shutdown(false); } }
以上,服务端的"服务"就写好了, 下面还要在服务端写一个入口类,把你的服务"注册"上.
内容如下:
package server; import helloapp.Hello; import helloapp.HelloHelper; import org.omg.CORBA.ORB; import org.omg.CORBA.ORBPackage.InvalidName; import org.omg.CosNaming.NameComponent; import org.omg.CosNaming.NamingContextExt; import org.omg.CosNaming.NamingContextExtHelper; import org.omg.CosNaming.NamingContextPackage.CannotProceed; import org.omg.CosNaming.NamingContextPackage.NotFound; import org.omg.PortableServer.POA; import org.omg.PortableServer.POAHelper; import org.omg.PortableServer.POAManagerPackage.AdapterInactive; import org.omg.PortableServer.POAPackage.ServantNotActive; import org.omg.PortableServer.POAPackage.WrongPolicy; public class Main { public static void main(String[] args) { try { // 创建一个ORB实例 ORB orb = ORB.init(args, null); // 得到一个RootPOA的引用,并激活POAManager POA rootpoa = POAHelper.narrow(orb .resolve_initial_references("RootPOA")); rootpoa.the_POAManager().activate(); // create servant and register it with ORB // 创建一个HelloImpl实例(servant),并注册到ORB上 HelloImpl helloImpl = new HelloImpl(); helloImpl.setOrb(orb); // 在服务中得到对象的引用 org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl); Hello href = HelloHelper.narrow(ref); //得到一个根名称的上下文 org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); // Use NamingContextExt which is part of the Interoperable // Naming Service (INS) specification. NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); // 在命名上下文中绑定这个对象 String name = "Hello"; NameComponent path[] = ncRef.to_name(name); ncRef.rebind(path, href); System.out.println("HelloServer ready and waiting ..."); //启动线程服务,等待客户端的调用 orb.run(); } catch (InvalidName e) { e.printStackTrace(); } catch (AdapterInactive e) { e.printStackTrace(); } catch (ServantNotActive e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (WrongPolicy e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (org.omg.CosNaming.NamingContextPackage.InvalidName e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NotFound e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (CannotProceed e) { // TODO Auto-generated catch block e.printStackTrace(); } System.out.println("HelloServer Exiting ..."); } }
注意 :这里虽然是入口,可是不能直接右键run as - > Java Application
---------------------------------------
---------------------------------------
实现客户端
1.要把服务端生成的工具类复制到客户端(最好包结构一致) 如图
2.编写客户端调用.
内容如下:
package client; import helloapp.Hello; import helloapp.HelloHelper; import org.omg.CORBA.ORB; import org.omg.CosNaming.NamingContextExt; import org.omg.CosNaming.NamingContextExtHelper; public class HelloClient { static Hello helloImpl; public static void main(String[] args) { try { // 创建一个ORB实例 ORB orb = ORB.init(args, null); // 获取根名称上下文 org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService"); // Use NamingContextExt instead of NamingContext. This is // part of the Interoperable naming Service. NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef); // 从上下文中获取接口实现对象 String name = "Hello"; helloImpl = HelloHelper.narrow(ncRef.resolve_str(name)); System.out.println(helloImpl.sayHello()); System.out.println("asdfasdfdasf"); } catch (Exception e) { e.printStackTrace(); } } }
这样 客户端就完成调用了. 下面就是如何 运行起来了.
1. 运行CORBA服务 (直接CMD运行即可)
orbd -ORBInitialPort 1053 -ORBInitialHost 192.168.1.42
注: 192.168.1.42是我自己的本地IP地址 1053是端口
CORBA服务独立于客户端和服务端,相当于一条桥梁.
这个窗口不要关掉,光标会一直闪.
2.启动服务端
启动服务端需要main函数传递参数,所以我们要先配一些main函数的参数. 如图:
点开:
Main就是我们服务端的入口函数. 之前有说过.
然后在arguments的program arguments: 写入
-ORBInitialPort 1053
端口1053是与之前的CORBA服务的端口对应的
服务端就配好了. 运行服务端.
不要关闭服务端.
3.启动客户端
这里我不用多说了,然后启动运行,就可以看到运行结果了.
说明: 依照原文,可能环境不同会出些奇怪的问题,希望读者先仔细检查是否和原文有出入,或者检查异常,还是不行的话,欢迎留言一起讨论.
CORBA的客户端-服务端建立确实比较麻烦,不过如果之前已经搭建一套框架的话,开发以来也是事半功倍的.