corba应用实例

corba应用实例
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地址)。运行结果如下图:

相关主题
相关文档
最新文档