利用corba进行显示书目列表

1. 准备工作
1) 下载安装Jacorb2.1

从http://www.jacorb.org/download.html下载JacORB_2.3.0_beta2-bin.zip(http://www.jacorb.org/releases/2.1/JacORB_2_1-full.tar.gz),解压缩到磁盘上,例如C:\JacORB
2) 设置相关的环境

为了在调试时可以找到有关包和jacorb.properties配置文件,
在系统环境变量中设置 JACORB_HOME=C:\JacORB,然后再设置classpath=.;%JACORB_HOME%\lib\idl.jar;%JACORB_HOME%\lib\jacorb.jar;%JACORB_HOME%\lib\logkit-1.2.jar;%JACORB_HOME%\lib\avalon-framework-4.1.5.jar;%JACORB_HOME%\classes;
然后设置PATH=%JACORB_HOME%\bin;

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

2. 命名服务配置
1)修改配置文件
在Corba中命名服务是非常重要的, 编辑jacorb.properties文件,设置其中的
ORBInitRef.NameService=file:/c:/NS_Ref(这里是示例,当然可以为任何httpURL或者其他路径),这个NS_Ref文件会在启动命名服务时生成.该配置文件其余部分保留默认值即可.
2) 测试命名服务(NS,Naming Service)是否可以正常启动

在dos窗口下输入
ns c:/NS_Ref

如果出现下面的输出说明已经正常启动
[configuration loaded from classpath resource file:/C:/JacORB_2_1classesjacorb.properties]
JacORB V 2.1, www.jacorb.org
(C) Gerald Brose, XTRADYNE TechnologiesFU Berlin, 16-Feb-2004
[jacorb.orb.intercept] INFO : InterceptorManager started with 0 SIs, 0 CIs and 1
IORIs
[jacorb.naming] INFO : NS up
[jacorb.orb] INFO : ORB run
如果没有任何输出,可能是由于你的jacorb.properties文件没有放到classpath所在的目录下。
如果没有正确启动NS,运行下面的demo时会出现下面的异常
[jacorb.orb.intercept] INFO : InterceptorManager started with 0 SIs, 0 CIs and 1 IORIs
....
[jacorb.giop] INFO : ClientConnectionManager: created new conn to target 192.168.4.161:4089
[jacorb] ERROR : java.net.ConnectException : Connection refused: connect

3 示例
1、在C:\JacORB的demo文件夹下建立一个book子目录,在book下建立一个IDL文件,如book.idl
/*
* This idl file is generated by the ORB Plugin
*/
module MyServer {
module hello {
interface BookInf{
wstring bookDB();
};
};
};



2、编译idl文件,有三种方法:利用elcipse的ORB Studio插件直接编译,自动生成7个文件;或者使用ant工具包,或者使用jacorb的idl命令,本例用ant工具实现。利用ant实现时需要修改build.xml文件,改写后为:
<?xml version="1.0"?>

<!DOCTYPE project [ <!ENTITY common SYSTEM "file:../../etc/common.xml"> ]>

<project name="demo" default="all" basedir="../..">

<!-- ==================================================== -->
<!-- Demo build file -->
<!-- ==================================================== -->

&common;

<target name="myinit">
<property name="name" value="book"/>
<property name="dirs.base" value="${basedir}"/>
<property name="classdir" value="${dirs.base}/classes"/>
<property name="lib" value="${dirs.base}/lib"/>
<property name="include" value="${dirs.base}/idl/omg"/>
<property name="dest" value="${dirs.base}/demo/${name}/generated"/>
</target>

<target name="all" depends="myinit,idl">
<javac srcdir="${dest}"
destdir="${classdir}"
classpath="${dirs.base}/classes"
includes="**/*.java"
/>
<javac srcdir="${dirs.base}/demo/${name}/"
destdir="${classdir}"
classpath="${dirs.base}/classes"
includes="*.java"
/>
</target>

<target name="idl" depends="myinit,load-taskdef">
<mkdir dir="${dest}" />
<jacidl srcdir="demo/${name}"
destdir="${dest}"
includepath="${include}"
includes="*.idl"/>
</target>

<target name="clean" depends="myinit">
<delete dir="${classdir}/demo/${name}"/>
<delete dir="${dirs.base}/demo/${name}/generated"/>
</target>

</project>

执行ant的过程如下:

正确启动NS后,DOS窗口转到demo/book目录下执行ant (如果ant没有安装则不会编译)

C:\JacORB\demo\book > ant

这样会进行idl编译book.idl文件,在C:\JacORB\demo\book\generated下生成corba所需的源文件

同时,ant会编译所有的java源文件, C:\JacORB\classes下面生成.class文件

3、实现book.idl文件hello模块中BookInf接口,手动创建BookImp.java文件
package MyServer.hello;

public class BookImp extends BookInfPOA{
//String book="0.退出"+"\n"+"1.红楼梦"+"\n"+"2.三国演义";
public String bookDB() {
// TODO Auto-generated method stub
return "0.退出"+"\n"+"1.红楼梦"+"\n"+"2.三国演义"+"\n"+"3.西游记"+"\n"+"4.红与黑"+"\n"+"5.漂亮朋友"+"\n"+"6.理智与情感"+"\n"+"7.简爱"+"\n"+"8.平凡的世界"+"\n"+"9.儿子与情人"+"\n"+"10.世界历史简史";
}
}

4、创建Server和Client(服务器端和客户端)程序
===================Server.java===========================
package MyServer.hello;


import org.omg.CORBA.ORB;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;

public class Server {
public static void main(String[] args) {
try {
ORB orb = ORB.init(args, null); // 初始化 ORB

POA poa = POAHelper.narrow(orb
.resolve_initial_references("RootPOA")); // 初始化 POA

poa.the_POAManager().activate();

// 创建一个 GoodDay 对象
BookImp bookImp = new BookImp();

// 创建 GoodDay 对象的引用
org.omg.CORBA.Object obj = poa.servant_to_reference(bookImp);

// 使用 naming service
NamingContextExt nc = NamingContextExtHelper.narrow(orb
.resolve_initial_references("NameService"));

nc.bind(nc.to_name("hello.goodDay"), obj); // 绑定对象

orb.run();
} catch (Exception e) {
e.printStackTrace();
}
}
}

===================Client.java===========================
package MyServer.hello;
import org.omg.CORBA.ORB;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import java.util.*;

public class Client {
public static int[] book;
public static int choice;
Client(){
book=new int[10];
for(int i=0;i<10;i++){
book[i]=0;
}
}
public static void main(String[] args) {
try{
BookInf bookInf;
Client t=new Client();

ORB orb = ORB.init(args, null); // 初始化 ORB

// 使用 naming service
NamingContextExt nc = NamingContextExtHelper.narrow(orb
.resolve_initial_references("NameService"));
org.omg.CORBA.Object obj = nc.resolve(nc.to_name("hello.goodDay")); //解析对象

bookInf = BookInfHelper.narrow(obj); //转换

// GoodDay 接口调用

System.out.println(bookInf.bookDB());
System.out.println("请选择你所要的书籍代号:");

do{
Scanner in=new Scanner(System.in);
choice=in.nextInt();
if(choice<0||choice>10){
System.out.println("您输入的不符合要求,请输入0-10之间的选项!");
}
else if(choice==0) break;
else{
t.book[choice-1]=1;
}
}while(choice!=0);

String booklist[]={"0.退出","1.红楼梦","2.三国演义","3.西游记","4.红与黑","5.漂亮朋友","6.理智与情感","7.简爱","8.平凡的世界","9.儿子与情人","10.世界历史简史"};
System.out.println("您选择的书目是:");
for(int i=0;i<10;i++){
if(t.book[i]!=0){
System.out.println(booklist[i+1]);
}
}
//System.out.println(bookInf.bookChosen(result));
}catch(Exception e) {
e.printStackTrace();
} :arrow:
}
}


5、运行程序
本地调用:

运行JacORB的ns,在DOS下输入ns c:\NS_Ref,打开服务。

这时ns把服务的信息写在了c:\NS_Ref文件里

运行Server和Client
另外打开两个命令窗口,分别运行jaco MyServer.hello.Server及jaco MyServer.hello.Client,即可看到客户端的书目信息列表。
参考资料:配置JacORB及ORB Studio:http://blog.csdn.net/soda7/archive/2008/05/19/2457795.aspx
利用ant工具:http://hi.baidu.com/riffling/blog/item/27fee911fb7cc116b8127b39.html

心得:Corba花了差不多有三天时间吧,一天半用来配置环境,一天半用来找bug,在idl语言中,如果是汉语的话不能使用string类型,而是wstring,本来想将选好的书目列表也封装进去,然后在客户端显示,但是不知道IDL语言中数组怎么使用,只好将就完成作业了。现在所实现的功能,和HelloWorld有一拼,幼稚呀!
而且Corba的实现机制也没有搞懂,就像EJB的作业一样,先记在这儿,写完报告再研究(希望可以)。
A JA Fighting!
ps:刚才TJ打电话叫实习,去还是不去呢?1K有点少了,时间还长,而且关键不知道能不能学到东东,怎么办?又没有别的公司可去,纠结~有大侠指引吗?呵呵呵~大侠不会看这么弱智的东东吧 :wink:
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值