JaCORB安装指南



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.javaHello 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目录下,在此目录下建立ClientServer目录,假设它们分别为客户端和服务端。

· 编译Hello.idl
D:\CorbaSample>idlj -oldImplBase -fall Hello.idl
这会生成一个HelloApp的目录

· 编译所有java文件:
D:\CorbaSample>javac *.java HelloApp/*.java

·
分别在ClientServer目录下建立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目录中
(注意:当然,你可以不必建立ServerClient目录及以上复制文件的操作,可以直接在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地址)

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值