corba应用实例
CORBA应用实例
CORBA对象服务的实现方式分为两种:对象的命名引用方式和字符串化对象引用方式,这个例子采用的方式是命名引用方式。不论采用何种高级语言,创建CORBA应用程序的过程大体如下:
1、编写IDL接口定义文件;
2、将接口定义文件编译为相应高级语言源代码,产生服务器框架与客户端存根;
3、基于服务器框架,编写服务对象实现程序;
4、基于客户端存根,编写客户对象调用程序;
5、分别编译客户对象和服务对象程序;
6、运行服务对象和客户对象程序;
CORBA实例分析
下面通过一个实例,描述如何通过Java创建CORBA应用程序。
1. 接口定义(Hello.idl)
Hello.idl
module HelloApp{
interface Hello
{
string sayHello();
oneway void shutdown();
};
};
通过Sun提供的将IDL文件编译成Java源代码的工具idlj(jdk1.3.0_01以上版本),为接口定义文件生成客户端存根和服务器框架。具体操作如下:idlj -fall Hello.idl
编译后将在HelloApp 子目录中形成以下六个文件:
n _HelloPOA.java
该抽象类是一个服务器skeleton和POA的结合,它可为服务器提供基本的CORBA 功能,实现了InvokeHandler接口和HelloOperations接口。
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()。
要完成该应用程序,只需在文件HelloServer.java 和HelloClient.java 中提供服务器和客户机的实现即可。
2. 接口实现(HelloImpl.java)
HelloImpl.java
import HelloApp.HelloPOA;
import org.omg.CORBA.*;
import java.util.*;
class HelloImpl extends HelloPOA {
private ORB orb;
public void setORB(ORB orb_val)
{
orb=orb_val;
}
public String sayHello()
{
return "\nHello World!\n";
}
public void shutdown()
{
orb.shutdown(false);
}
}
3.服务器(HelloServer.java)
服务器类含有服务器的main()方法,可完成以下任务:
--创建一个 ORB 实例
-- 创建一个HelloImpl实例(CORBA Hello对象的实现)并通知 ORB
-- 获取一个命名上下文的 CORBA 对象引用,在该命名上下文中注册新 CORBA 对象
--在命名上下文中将新对象注册在“Hello”名下
-- 等待对新对象的调用
HelloServer.java
import HelloApp.*;
import https://www.360docs.net/doc/dc12254415.html,Component;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import org.omg.CosNaming.NamingContextExtPackage.*;
import org.omg.CORBA.*;
import org.omg.PortableServer.POA;
public class HelloServer {
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try{
ORB orb=ORB.init(args,null);
POA rootpoa=(POA)orb.resolve_initial_references("RootPOA");
rootpoa.the_POAManager().activate();
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");
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(Exception e) {
System.err.println("Error:"+e);
e.printStackTrace(System.out);
}
System.out.println("Hello server Exiting...");
}
}
4、客户端(HelloClient.java)
客户机将完成以下任务:
-- 创建一个 ORB
-- 获取一个指向命名上下文的引用
--在命名上下文中查找 "Hello" 并获得指向该 CORBA 对象的引用
--调用对象的 sayHello() 操作并打印结果
HelloClient.java
import HelloApp.*;
import org.omg.CosNaming.*;
import org.omg.CosNaming.NamingContextExtPackage.*;
import org.omg.CORBA.*;
public class HelloClient {
static Hello helloImpl;
/**
* @param args
*/
public static void main(String[] args) {
// TODO Auto-generated method stub
try {
ORB orb =ORB.init(args,null);
org.omg.CORBA.Object objRef=orb.resolve_initial_references("NameService");
NamingContextExt ncRef=NamingContextExtHelper.narrow(objRef);
String name="Hello";
helloImpl=HelloHelper.narrow(ncRef.resolve_str(name));
System.out.println("Obtained a handle on server object:"+helloImpl);
System.out.println(helloImpl.sayHello());
helloImpl.shutdown();
}
catch(Exception e)
{
System.out.println("Error:"+e);
e.printStackTrace(System.out);
}
}
}
5、编译运行
a)对所有的java文件进行编译----- D:\corbaExample\src(源文件所在目录)>javac *.java
HelloApp\*.java
b)确保名字服务器处于运行状态: D:\corbaExample\src>tnameserv -ORBInitialPort 1050
c)启动 Hello 服务器: D:\corbaExample\src>java HelloServer -ORBInitialPort 1050
d)CORBA客户端调用CORBA服务:
D:\corbaExample\src >java HelloClient -ORBInitialPort 1050
(本地调用,不需要用-ORBInitialHost参数来指定远程的IP地址)
D:\corbaExample\src >java HelloClient -ORBInitialHost localhost -ORBInitialPort 1050
(远程调用CORBA服务,可以将localhost替换成远程的IP地址)。运行结果如下图: