Corba code

 环境:jdk1.4, JacORB 2.2
Java.sun.com
www.jacorb.org

CORBA构架的基本结构:


虚线表示请求,实线表示信息传递


第一步:实现Server端:
    基本的CORBA-Server实现包括一下几部分内容
1、    定义IDL接口
module Module1 {
  interface Interface1 {
    string operation1(in string param1);
  };
};

2、    使用idlj生成CORBA应用辅助类(包括存根和Helper类)
Idlj命令参数简介
a)    -fall:生成客户端和服务器端的代码
b)    -fclient、-fserver:只生成客户端或服务器端代码
c)    -oldImpBase:生成旧版本的 *ImpBase代码
我们在网上查到的代码经常(>90%)包含****ImpBase.java 文件,而jdk1.4的默认实现基类变为*****POA(其实不光是名称变了,同时涉及ORB实现的变化)。
=============================
Idlj将生成以下文件,包名为Module1
Interface1Holder.java
Interface1Operations.java  //真正的业务应用中要使用的接口
Interface1POA.java       //继承这个类实现业务功能
_Interface1Stub.java
Interface1.java
Interface1Helper.java

只用Interface1Operations,Interface1POA两个部分需要我们关心
=============================
使用BES(Borland Enterprise Server)生成的辅助类也可以使用,需要在Enterprise Setup中配置visiBroker/path for ORB tools.
然后右键点 idl文件Make,就会生成相应的文件,但不能的工程目录下看见这些文件(即只能在Jbuilder中看这些文件),比较别扭。另外代码中会有对borland接口的依赖,所以不推荐使用。

3、    编写接口的真正实现――我们的业务代码
继承Interface1POA实现业务代码:
public class Interface1Impl  extends Module1.Interface1POA{
public String operation1(String para1) {
    System.out.println("Client Call in." + para1);
    return "Server is returned " + para1;
  }


4、    编写IOR存储、交互程序
IOR:包含服务器、端口号、对象标识等内容,Client ORB通过该信息可以连接到服务器端ORB从而,进行通信。

该标识是一个字符串类,例如:
IOR:000000000000002b49444c3a6f6d672e6f72672f436f734e616d696e672f4e616d696e67436f6e746578744578743a312e300000000000010000000000000084000102000000000f3138322e3131392e3131312e353900000384000000000035afabcb0000000020743459d00000000100000000000000010000000d544e616d65536572766963650000000000000004000000000a0000000000000100000001000000200000000000010001000000020501000100010020000101090000000100010100

常见的可以使用文件作为IOR存储交换解质
另外通过命名服务进行ORB.Object存储、交换也可以。

使用文件存储的代码:
System.getProperties().put("org.omg.CORBA.ORBClass",
                                    "org.jacorb.orb.ORB");
System.getProperties().put("org.omg.CORBA.ORBSingletonClass",
                                    "org.jacorb.orb.ORBSingleton");
ORB orb = ORB.init( args, null );
POA poa =POAHelper.narrow( orb.resolve_initial_references( "RootPOA" ));
poa.the_POAManager().activate();
Interface1Impl impl = new Interface1Impl();
org.omg.CORBA.Object obj =poa.servant_to_reference( impl );
PrintWriter pw = new PrintWriter( new FileWriter( "c:/test.txt" ));
pw.println( orb.object_to_string( obj )); 
pw.flush();
pw.close();

使用命名服务的代码:(使用jdk1.4:tnameserv作为服务器)
如果:
org.omg.CORBA.ORBClass:com.sun.corba.se.internal.Interceptors.PIORB
(com.sun.corba.se.internal.Interceptors.PIORB包含在jdk-dt.jar中)
则:
String paras[] = { "-ORBInitialHost", "127.0.0.1", "-ORBInitialPort", "900"}
           ORB orb = ORB.init(paras, null );

            如果:
            org.omg.CORBA.ORBClass:org.jacorb.orb.ORB
则:
要建立 jacorb.properties文件,并放在classpath中
添入以下配置串:
ORBInitRef.NameService=corbaloc::127.0.0.1:900/NameService

============================
org.omg.CORBA.Object objRef = null;  //命名服务也使用自身传出Context
objRef = orb.resolve_initial_references("NameService");
NamingContext ncRef = NamingContextHelper.narrow(objRef);
Interface1Impl impl = new Interface1Impl();
org.omg.CORBA.Object objImpl =poa.servant_to_reference( impl );
NameComponent nc = new NameComponent("MyService", "");
NameComponent path[] = {nc};
ncRef.rebind(path, objImpl);

注:请自行添加try-catch异常处理代码。

5、    编写Server启动代码
orb.run();

  
第二步:实现Client端:
1、    定义IDL接口
2、    使用idlj生成CORBA应用辅助类
3、    获取IOR:
a)    通过文件
java.util.Properties props = new java.util.Properties();
props.setProperty("org.omg.CORBA.ORBClass", org.jacorb.orb.ORB");
props.setProperty("org.omg.CORBA.ORBSingletonClass", "org.jacorb.orb.ORBSingleton");
      ORB orb = ORB.init(args, props);
FileInputStream f = new FileInputStream("c:/test.txt");
byte[] buf = new byte[f.available()];
f.read(buf, 0, f.available());
String ior = new String(buf);
org.omg.CORBA.Object obj = orb.string_to_object(ior);

b)    通过命名服务
org.omg.CORBA.Object objRef = null;
objRef = orb.resolve_initial_references("NameService");
NamingContext ncRef = NamingContextHelper.narrow(objRef);
NameComponent nc = new NameComponent("MyService", "");
NameComponent path[] = {nc};
org.omg.CORBA.Object obj= ncRef.resolve(path);


4、    调用远程对象:
Interface1Operations remObject = Interface1Helper.narrow(obj);
System.out.println(remObject.operation1("Client1"));

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值