不知道大家注意到没有,在JDK1.4编译idl文件时使用的 idlj -oldImplBase -fall Hello.idl
这个命令带有“-oldImplBase”参数,表示这是一个老版本的实现。而JDK1.4版本下,可以直接使用
idlj -fall Hello.idl
命令,这样idlj编译器对服务器端生成的是轻便对象适配器(POA)。
(直接再命令行敲入idlj可以得到其使用说明)
这里我就不作详细说明了,操作基本上与上一个例子相似。
首先在 D://CorbaSample2 目录下编写下面4个文件,然后依次进行如下操作:
D://CorbaSample2>idlj -fall Hello.idl
D://CorbaSample2>javac *.java HelloApp/*.java
D://CorbaSample2>tnameserv -ORBInitialPort 1050
D://CorbaSample2>java HelloServer -ORBInitialPort 1050
D://CorbaSample2>java HelloClient -ORBInitialPort 1050 (
本地调用,不需要用-ORBInitialHost参数来指定远程的IP地址)
D://CorbaSample//Server>java HelloClient -ORBInitialHost localhost -ORBInitialPort 1050(
远程调用CORBA服务,可以将localhost替换成远程的IP地址)
(
注意
:
这里为了方便.我没有再划分客户端和服务端。进行对比,你可以发现这次idlj编译器生成的文件与上例中生成的文件有和不同。)
Hello.idl
|
module HelloApp{
interface Hello {
string sayHello(in string message);
};
};
|
HelloImpl.java
|
/* * @author javamxj
(优快云 Blog) 创建日期 2004-12-27 */
import org.omg.CORBA.*;
import HelloApp.HelloPOA;
public class HelloImpl extends HelloPOA {
private ORB orb;
public void setORB(ORB orb_val) {
orb = orb_val;
}
/*
实现接口声明方法sayHello */
public String sayHello(String message) {
System.out.println("
我在CORBA的服务器端,客户端正在调用/'sayHello/'方法。 ");
System.out.println("Hello " + message);
return message;
}
}
|
HelloServer.java
|
/* * @author javamxj
(优快云 Blog) 创建日期 2004-12-27 */
import HelloApp.*;
import org.omg.CosNaming.*;
import org.omg.CORBA.*;
import org.omg.PortableServer.*;
import org.omg.PortableServer.POA;
public class HelloServer {
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();
/*
创建一个实例并将其向 ORB 注册 */
HelloImpl h = new HelloImpl();
h.setORB(orb);
System.out.println("
将实例注册到ORB ");
/*
获取对服务端的对象引用 */
org.omg.CORBA.Object ref = rootpoa.servant_to_reference(h);
Hello href = HelloHelper.narrow(ref);
/*
从名称服务中获取根元素名称上下文 */
org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
/*
在Hello名称下注册新对象 */
String name = "Hello";
NameComponent path[] = ncRef.to_name(name);
ncRef.rebind(path, href);
/*
等待客户端的调用。 */
orb.run();
System.out.println("
等待CORBA客户端调用...");
}
catch (Exception e) {
System.err.println("ERROR: " + e);
e.printStackTrace(System.out);
}
System.out.println("HelloServer Exiting ...");
}
}
|
HelloClient.java
|
/* * @author javamxj
(优快云 Blog) 创建日期 2004-12-27 */
import HelloApp.*;
import org.omg.CosNaming.*;
import org.omg.CORBA.*;
public class HelloClient {
public static void main(String args[]) {
try {
/*
创建和初始化 ORB */
ORB orb = ORB.init(args, null);
/*
获取根命名上下文 */
org.omg.CORBA.Object objRef = orb .resolve_initial_references("NameService");
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
/*
在名称上下文中查找Hello对象,获取对它的引用。 */
String name = "Hello";
Hello h = HelloHelper.narrow(ncRef.resolve_str(name));
System.out.println("
我在客户端,开始调用CORBA服务器端的/'sayHello/'方法");
System.out.println("
欢迎, " + h.sayHello("javamxj blog"));
} catch (Exception e) {
System.out.println("
错误 : " + e);
e.printStackTrace(System.out);
}
}
}
|
==============JACORB2.3,20140307===========
在2.3版本下编译IDL语法有变
变成:idl *,或者idl hello.idl
同时为了易于管理,设置环境变量时,如下
JACORB_HOME=E:\Java\JacORB2.3
CLASSPATH=.;%JACORB_HOME%/lib/antlr-2.7.2.jar;%JACORB_HOME%/lib/avalon-framework-4.1.5.jar;%JACORB_HOME%/lib/concurrent-1.3.2.jar;%JACORB_HOME%/lib/idl.jar;%JACORB_HOME%/lib/jacorb.jar;%JACORB_HOME%/lib/logkit-1.2.jar;%JACORB_HOME%/lib/wrapper-3.0.3.jar;%JACORB_HOME%/classes;
=====END=====