您的位置:首页 > 其它

JaCORB安装指南

2013-12-26 12:09 267 查看

JacORB的应用开发一般分为以下五步:

1.写IDL接口定义编译IDL

2.接口定义生成Java类

3.实现步骤2中生成的接口

4.写服务器启动类,并注册到ORB

5.写客户端去获取服务对象引用

下载安装Jacorb2.2.4

1)
http://www.jacorb.org/download.html下载JacORB 2.2.4,解压缩到磁盘上,例如C:\JacORB

2)
在系统环境变量中设置

classpath=.;C:\JacORB\lib\idl.jar;

C:\JacORB\lib\jacorb.jar;

C:\JacORB\lib\classes;

另外,为了方便使用ant和命令行工具,在path中加入C:\JacORB\bin

3)
接着,把C:\JacORB\etc目录下的jacorb_properties.template复制到C:\JacORB\classes目录下,并更名为jacorb.properties

4)
配置命名服务, 编辑jacorb.properties文件

设置其中的 ORBInitRef.NameService=file:/ D:/JacORB/NS_Ref,这个NS_Ref文件会在启动命名服务时生成.该配置文件其余部分保留默认值即可.

测试命名服务(NS,Naming Service)是否可以正常启动

1)
在C:\JacORB\bin目录下找到文件jac.bat.tpl,更名为jac.bat

2)
在dos窗口下输入 ns NS_Ref

如果出现下面的输出说明已经正常启动

[jacorb.orb.print_ver] INFO:

JacORB V 2.3.0, www.jacorb.org

<C> The JacORBproject 17-Feb_2007

[jacorb.orb] INFO :Property”jacorb.hashtable_class” is set to:java.util.Hashtable

……

……

[jacorb.naming] INFO : NS up

[jacorb.orb] INFO : ORB run

如果没有任何输出,可能是由于你的jacorb.properties文件没有放到classpath所在的目录下。

public static void main( String [] args )

 {

  Hashtable env = new Hashtable();

  env.put(Context.INITIAL_CONTEXT_FACTORY,"org.jnp.interfaces.NamingContextFactory");

  env.put(Context.PROVIDER_URL, "localhost:1099");

  env.put("java.naming.factory.url.pkgs","org.jboss.naming:org.jnp.interfaces");

  try

  {

   Context ctx = new InitialContext(env);

   Object obj = ctx.lookup( "HelloWorld" );

   HelloWorldHome home =(HelloWorldHome)javax.rmi.PortableRemoteObject.narrow(

obj, HelloWorldHome.class );

   HelloWorld helloWorld = home.create();

   System.out.println( helloWorld.hello());

   helloWorld.remove();

  }

  catch ( Exception e )

  {

   e.printStackTrace();

   System.out.println( "Exception: " + e.getMessage() );

  }

 }

要体现CORBA技术的运作,就从这个helloworld级的CORBA开始,用Java写

1. 接口定义 (Hello.idl)Hello.idl

module HelloApp

{

interface Hello

{

string sayHello(in string message);

};

};

装了Java就自带了工具idlj(jdk1.3.0_01以上版本,之前版本的是idltojava或idl2java),为接口定义文件生成客户端存根和服务器框架。具体操作如下:

idlj -oldImplBase -fall Hello.idl

编译后将在 HelloApp 子目录中形成以下六个文件:

●_HelloImplBase.java

该抽象类是一个服务器 skeleton,它可为服务器提供基本的 CORBA 功能。它实现 Hello.java 接口。服务器类 HelloServant 扩展 _HelloImplBase。

● _HelloStub.java

该类是客户机 stub,可为客户机提供 CORBA 功能。它实现 Hello.java 接口。

●Hello.java

该接口含有 IDL 接口的 Java 版本。Hello.java 接口扩展 org.omg.CORBA.Object 并提供标准的 CORBA 对象功能。

●HelloHelper.java

这是一个终态类,可以提供辅助功能,特别是提供将 CORBA
对象引用转换为适当类型所需的 narrow() 方法。

●HelloHolder.java

这是一个终态类,其中含有 Hello 类型的公有实例成员。它可为“out”
和 “inout” 变量提供操作。CORBA
有这些变量,但不容易映射为 Java 的语义。

●HelloOperations.java

这是一个接口类,其中含有方法 sayHello()。

要完成该应用程序,只需在文件 HelloServer.java
和 HelloClient.java 中提供服务器和客户机的实现即可。

2. 接口实现(HelloImpl.java)HelloImpl.java是Hello IDL
接口的实现;每个Hello实例都由一个HelloImpl实例来实现。HelloImpl是_HelloImplBase的子类,_HelloImplBase是由
idlj编译器从示例 IDL 中生成的。

import HelloApp.*;

public class HelloImpl extends _HelloImplBase {

/* 构造函数 */

public HelloImpl() {

super();

}

/* 实现接口声明方法sayHello */

public String sayHello(String message) {

System.out.println("我在CORBA的服务器端,客户端正在调用'sayHello'方法。
");

System.out.println("Hello " + message);

return message;

}

}

3.
服务器端程序(HelloServer.java)


import org.omg.CosNaming.*;

import org.omg.CORBA.*;

public class HelloServer {

public static void main(String args[]) {

try {

/* 创建和初始化 ORB */

ORB orb = ORB.init(args, null);

System.out.println("开始 ORB Server ...");

/* 创建一个实例并将其向 ORB
注册 */

HelloImpl helloImpl = new HelloImpl();

orb.connect(helloImpl);

System.out.println("将实例注册到ORB ");

/* 获取根命名上下文 */

org.omg.CORBA.Object objRef =orb.resolve_initial_references("NameService");

NamingContext ncRef = NamingContextHelper.narrow(objRef);

/* 绑定命名中的对象引用 */

NameComponent nc = new NameComponent("Hello", "");

NameComponent path[] = { nc };

ncRef.rebind(path, helloImpl);

/* 等待来自客户机的调用 */

java.lang.Object sync = new java.lang.Object();

synchronized (sync) {

sync.wait();

}

System.out.println("等待CORBA客户端调用...");

} catch (Exception e) {

System.err.println("错误: " + e);

e.printStackTrace(System.out);

}

}

}

4. 客户端程序(HelloClient.java)

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");

NamingContext ncRef = NamingContextHelper.narrow(objRef);

/* 解析命名中的对象引用 */

NameComponent nc = new NameComponent("Hello", "");

NameComponent path[] = { nc };

Hello h = HelloHelper.narrow(ncRef.resolve(path));

/* 调用 Hello
服务器对象并打印结果 */

System.out.println("我在客户端,开始调用CORBA服务器端的'sayHello'方法");

System.out.println("欢迎, " + h.sayHello("javamxj blog"));

} catch (Exception e) {

System.out.println("错误 : " + e);

e.printStackTrace(System.out);

}

}

}

CORBA Server/Client的编译与运行

· 把上面4个文件复制到D:\CorbaSample目录下,在此目录下建立Client和Server目录,假设它们分别为客户端和服务端。

· 编译Hello.idl

D:\CorbaSample>idlj -oldImplBase -fall Hello.idl

这会生成一个HelloApp的目录

· 编译所有java文件:

D:\CorbaSample>javac *.java HelloApp/*.java

· 分别在Client和Server目录下建立HelloApp子目录,将D:\CorbaSample\HelloApp目录中的

_HelloStub.class

Hello.class

HelloHelper.class

HelloHolder.class

HelloOperations.class

复制到D:\CorbaSample\Client\HelloApp目录下,再将D:\CorbaSample目录中的HelloClient.class复制到D:\CorbaSample\Client目录下。

将D:\CorbaSample\HelloApp目录中的

_HelloImplBase.class

Hello.class

HelloOperations.class

复制到D:\CorbaSample\Server\HelloApp目录下,再将D:\CorbaSample目录中的HelloServer.class和
HelloImpl.class 复制到D:\CorbaSample\Server目录中

(注意:当然,你可以不必建立Server和Client目录及以上复制文件的操作,可以直接在D:\CorbaSample目录中进行操作,我这样做的目的主要是为了区分客户端和服务端)

· 确保名字服务器处于运行状态:

D:\CorbaSample\Server>tnameserv -ORBInitialPort 1050

· 在另一个DOS窗口启动 Hello
服务器:

D:\CorbaSample\Server>java HelloServer -ORBInitialPort 1050

· 又再在另一个DOS窗口启动CORBA客户端调用CORBA服务:

D:\CorbaSample\Client>java HelloClient -ORBInitialPort 1050

(本地调用,不需要用-ORBInitialHost参数来指定远程的IP地址)

D:\CorbaSample\Server>java HelloClient -ORBInitialHost localhost -ORBInitialPort 1050

(远程调用CORBA服务,可以将localhost替换成远程的IP地址)
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: