实现详解:
1编写IDL 接口HelloWorld.idl :
模块样本{
接口HelloWorld {
string sayHello();
};
};
说明:CORBA处理字符串有:String和wstring两种类型,字符串类型主要用于处理ASCII类型的字符串,wstring 用于处理多字节的字符串,例如:中文。
2 编译IDL 接口:X :\ corba> idlj -fall H e lloWorld.idl
编译结果生成样品包,生成下述文件
_HelloWorldStub.java
HelloWorld.java
HelloWorldHelper.java
HelloWorldHolder.java
HelloWorldOperations.java
HelloWorldPOA.java
3 编写并编译服务端程序:HelloWorldServer.java
进口样品。*;
import org.omg.CosNaming。*;
import org.omg.CosNaming.NamingContextPackage。*;
import org.omg.CORBA。*;
import org.omg.CORBA.portable。*;
import org.omg.PortableServer。*;
HelloWorldServant类扩展HelloWorldPOA { // 对象实现类
public String sayHello(){
返回“\ n你好世界!\ n”;
}
}
public class HelloWorldServer { //服务程序
public static void main(String args []){
尝试{
// 初始化ORB
ORB orb = ORB.init(args,null);
//取根POA的引用
org.omg.CORBA.Object poaobj = orb.resolve_initial_references(“RootPOA”);
org.omg.PortableServer.POA rootPOA = org.omg.PortableServer.POAHelper.narrow(poaobj);
org.omg.PortableServer.POAManager manager = rootPOA.the_POAManager();
// 创建伺服对象
HelloWorldServant objRef = new HelloWorldServant();
HelloWorld obj = objRef._this(orb);
// 绑定命名服务
NamingContext ncRef = NamingContextHelper.narrow(orb.resolve_initial_references(“NameService”));
NameComponent nc = new NameComponent( “Hello”,“”);
NameComponent path [] = {nc};
ncRef.rebind(path,obj);
// 激活POA管理器
manager.activate();
//等待处理客户程序的请求
System.out.println(“HelloWorld正在运行!”);
orb.run();
} catch(例外e){
System.err.println(“ERROR:”+ e);
e.printStackTrace(System.out的);
}
}
}
4 编写并编译客户端程序:HelloWorldClient.java
进口样品。*;
import org.omg.CosNaming。*;
import org.omg.CORBA。*;
公共类HelloWorldClient {
public static void main(String args []){
尝试{
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};
HelloWorld他lloWorld = HelloWorldHelper.narrow(ncRef.resolve(path));
String hello = helloWorld.sayHello();
的System.out.println(你好);
} catch(例外e){
System.out.println(“ERROR:”+ e);
e.printStackTrace(System.out的);
}
}
}
5 运行
启动名字服务器:X :\ corba > tnameserv -ORBInitialPort 1050
启动服务端程序:X :\ corba > java HelloWorldServer -ORBInitialPort 1050
输出:HelloWorld正在运行
启动客户端程序:X :\ corba > java HelloWorldClient -ORBInitialPort 1050
输出:Hello World!
注意事项:
- 要转到类所在文件目录启动相应程序;
- 名字服务器,端的服务客户状语从句:要端的分别启动一个DOS命令提示符界面。
- 可采用批处理命令启动相应程序,分别为:
(1)启动名字服务器:
tnameserv -ORBInitialPort 1050
@暂停
(2)启动服务器端程序:
java HelloWorldServer -ORBInitialPort 1050
@暂停
(3)启动客户端程序:
java HelloWorldClient -ORBInitialPort 1050
@暂停
要求关系编写实现显示“你好,世界!+班级+中文姓名”字符串。
具体步骤
因为最后要在客户端输出Hello World +班级+姓名,字符串类型主要用于处理ASCII类型的字符串,wstring 用于处理多字节的字符串。班级和姓名含中文,如果在IDL文件中直接用字符串的话,后面在客户端是不会显示班级和姓名的,所以在将IDL中的字符串改为wstring的然后在编译这个接口就好了。
首先在cmd中进入idl文件所在处,用命令:idlj -fall H e lloWorld.idl编译idl接口。同级目录中会产生一个样包,将这个包拖入eclipse。
然后将作业包中已经给出的代码添加到对应的类中。
在dos中进入到文件所在地,执行tnameserv -ORBInitialPort 1050 命令,1050是端口号。
在客户端HelloWorldClient中将输出改为Hello World +班级+姓名
右击客户端HelloWordClient.java选择运行,选择运行配置,在里面配置端口号。完成后点击运行。
最后执行结果如下