本文主要是介绍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"));
这篇关于Corba code的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!