原帖请参考:http://blog.sina.com.cn/s/blog_54a96e8701009g17.html
入门参考,很不错
最近写毕业论文学习CORBA,看了几天的理论.今天在网上搜了个HelloCORBA的小程序,调试了一下,弄明白了一些概念和原理.人的记忆力是有限的,特开博将过程写下来.供以后参考.
写一个CORBA程序的步骤:
1. 编写IDL接口定义文件;
2. 将接口定义文件编译为相应高级语言源代码,产生服务器框架与客户端存根;
3. 基于服务器框架,编写服务对象实现程序;
4. 基于客户端存根,编写客户对象调用程序;
5. 分别编译客户对象和服务对象程序;
6. 运行服务对象和客户对象程序;
这个步骤网上COPY的,比较笼统.不过程序根据步骤一步一步来还是很好写的.
写一个Hello,CORBA的小程序
1. 编写IDL接口定义文件
文件名:Hello.idl |
module HelloApp{ interface Hello{ string sayHello(in string sayHello); } } |
程序解释:定义一个模块 HelloApp,这个相当于JAVA里面的包.然后定义了一个接口Hello,该接口包含一个方法sayHello,用来显示Hello,CORBA
2. 将接口定义文件编译为相应高级语言源代码,产生服务器框架与客户端存根;
Java IDL 即是CORBA 的一个实现,它是JDK1.3 或更高版本的核心软件包之一,定义在org.omg.CORBA及其子包中。我们利用JAVA提供的IDL编译工具对IDL文件进行编译.
idlj -oldImplBase -fall Hello.idl
先解释一下参数的意思.-oldImplBase 表示生成与旧(1.4 版之前)JDK ORB 兼容的框架.-f 是定义要发出的绑定。-fall表示绑定所有.包括客户端和服务器端.
编译后会产生六个文件,文件的意义从别的网站COPY过来了
n _HelloImplBase.java
该抽象类是一个服务器 skeleton,它可为服务器提供基本的 CORBA 功能。它实现 Hello.java 接口。服务器类 HelloServant 扩展 _HelloImplBase。
n _HelloStub.java
该类是客户机 stub,可为客户机提供 CORBA 功能。它实现 Hello.java 接口。
n Hello.java
该接口含有 IDL 接口的 Java 版本。Hello.java 接口扩展 org.omg.CORBA.Object 并提供标准的 CORBA 对象功能。
n HelloHelper.java
这是一个终态类,可以提供辅助功能,特别是提供将 CORBA 对象引用转换为适当类型所需的 narrow() 方法。
n HelloHolder.java
这是一个终态类,其中含有 Hello 类型的公有实例成员。它可为“out” 和 “inout” 变量提供操作。CORBA 有这些变量,但不容易映射为 Java 的语义。
n HelloOperations.java
这是一个接口类,其中含有方法 sayHello()。
生成了相应的代码后,接下来对Hello接口进行实现,该类继承_HelloImplBase类.因为_HelloImplBase类是对HELLO接口的一个抽象的实现.新建一个HelloImpl.java文件,用来实现HELLO接口
HelloImpl.java |
import HelloApp.*; public class HelloImpl extends _HelloImplBase { HelloImpl() { super(); } public String sayHello(String message) { System.out.println("It's server,clint is invoking.."); System.out.println("Hello"+message); return message; } } |
实现Hello接口后,接下来就是对服务器端和客户端分别编写相应的代码
3. 基于服务器框架,编写服务对象实现程序;
服务器端程序编写的步骤
1. 创建一个 ORB 实例
2. 创建一个HelloImpl实例(CORBA Hello对象的实现)并通知 ORB
3. 获取一个命名上下文的 CORBA 对象引用,在该命名上下文中注册新 CORBA 对象
4. 在命名上下文中将新对象注册在“Hello”名下
5. 等待对新对象的调用
按此步骤写一个HelloServer.java的程序
HelloServer.java |
import org.omg.CosNaming.*; import org.omg.CORBA.*; public class HelloServer { public static void main(String args[]){ try{ //初始化ORB ORB orb=ORB.init(args,null); System.out.println("ORB initial..."); //创建一个实例,并向ORB注册 HelloImpl helloImpl = new HelloImpl(); orb.connect(helloImpl); System.out.println("将实例注册到ORB"); //获取一个命名上下文 org.omg.CORBA.Object obRef = orb.resolve_initial_references("NameService"); NamingContext ncRef = NamingContextHelper.narrow(obRef); //绑定命名中的对象引用 NameComponent nc = new NameComponent("Hello",""); NameComponent path[] = { nc }; ncRef.rebind(path, helloImpl); //等待客户机的调用 java.lang.Object sync = new java.lang.Object(); synchronized (sync) { sync.wait(); } System.out.println("等待CORBA客户端调用..."); } catch (Exception e) { System.err.println("错误: " + e); e.printStackTrace(System.out); } } } |
4. 基于客户端存根,编写客户对象调用程序;
HelloClient.java |
//· 创建一个 ORB //· 获取一个指向命名上下文的引用 //· 在命名上下文中查找 "Hello" 并获得指向该 CORBA 对象的引用 //· 调用对象的 sayHello() 操作并打印结果 import org.omg.CosNaming.*; import org.omg.CORBA.*; import HelloApp.*; public class HelloClient { public static void main(String args[]){ try{ ORB orb = ORB.init(args,null); System.out.println("ORB initial..."); //获取一个命名上下文 org.omg.CORBA.Object obRef = orb.resolve_initial_references("NameService"); NamingContext ncRef = NamingContextHelper.narrow(obRef); NameComponent nc = new NameComponent("Hello", ""); NameComponent path[] = { nc }; Hello h = HelloHelper.narrow(ncRef.resolve(path)); System.out.println("我在客户端,开始调用CORBA服务器端的'sayHello'方法"); System.out.println("欢迎, " + h.sayHello("javamxj blog")); }catch (Exception e) { System.out.println("错误 : " + e); e.printStackTrace(System.out); } } } |
5. 分别编译客户对象和服务对象程序;
程序写好后,接下来就是对程序的编译了,先做如下的准备工作.将上面编写的四个文件复制到一个新文件夹,如d:/HelloCorba
编译Hello.idl
D:\HelloCorba>idlj -oldImplBase -fall Hello.idl
这会生成一个HelloApp的目录
再对所有的JAVA文件进行编译
D:\HelloCorba>javac *.java HelloApp/*.java
编译中如果有问题,那代表程序中有些地方不正确,根据相应提示修改一下就可以了
接下来就可以运行程序了.为了看执行效果,将服务器端和客户端代码分开
新建一个SERVER的文件夹,再建一个CLIENT的文件夹用来表示服务器和客户.
分别在Client和Server目录下建立HelloApp子目录,将D:\CorbaSample\HelloApp目录中的
_HelloStub.class
Hello.class
HelloHelper.class
HelloHolder.class
HelloOperations.class
复制到D:\CorbaSample\Client\HelloApp目录下,再将D:\CorbaSample目录中的HelloClient.class复制到D:\CorbaSample\Client目录下。
将D:\CorbaSample\HelloApp目录中的
_HelloImplBase.class
Hello.class
HelloOperations.class
复制到D:\CorbaSample\Server\HelloApp目录下,再将D:\CorbaSample目录中的HelloServer.class和 HelloImpl.class 复制到D:\CorbaSample\Server目录中
确保名字服务器处于运行状态:
D:\HelloCorba\Server>tnameserv -ORBInitialPort 1050
· 启动 Hello 服务器:
D:\HelloCorba\Server>java HelloServer -ORBInitialPort 1050
· CORBA客户端调用CORBA服务:
D:\HelloCorba\Client>java HelloClient -ORBInitialPort 1050
这样程序就可以运行了
如果调试过程中有什么问题,可以留言给我