要求编写实现显示“Hello,World!+班级+中文姓名”字符串
1. 使用IDL语言开发开发idl文件,这个文件中描述了接口的定义
module sample{
interface HelloWorld{
wstring sayHello();
};
};
module:对应了java中的package,
interface:对应了java中的interface,HelloWorld即接口名称
sayHello:对应了java中interface声明的方法
wstring:对应了java中方法的返回值。
说明:CORBA处理字符串有:String和wstring两种类型,string类型主要用于处理ASCII类型的字符串,wstring用于处理多字节的字符串,例如:中文。因此本程序使用wstring类型。
2. 使用java中的idlj命令,将idl语言翻译成java语言,并生成java代码
将idl文件拷贝到JDK的bin目录下,然后在命令行下切换到bin目录下执行以下命令:
idlj -fall helloworld.idl
执行此命令后会在bin目录下生成sample文件夹,其中包含6个java类,将这个文件夹直接拷到Eclipse中创建的工程下面的src中,如下图所示:
3. 服务端的实现代码
在Eclipse创建的工程下的src目录下新建server包,实现服务端的开发
1)新建HelloWorldImpl类,实现say Hello()方法:
package server;
import sample.HelloWorldPOA;
public class HelloWorldImpl extends HelloWorldPOA {
/*
* 服务端的实现代码
* @see sample.HelloWorldOperations#sayHello()
*/
public String sayHello {
return "helloWorld!,班级,姓名";
}
}
2) HelloWorldServer类,实现server启动的代码,这段代码主要功能是将接口实现注册到ORB中,并启动监听,等待Client客户端来调用:
package server;
import org.omg.CosNaming.*;
import sample.HelloWorld;
import org.omg.CORBA.*;
public class HelloWorldServer {
public static void main(String args[]) {
try {
args = new String[2];
args[0] = "-ORBInitialPort";
args[1] = "1050";
// 初始化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();
// 创建伺服对象
HelloWorldImpl objRef = new HelloWorldImpl();
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 is running!");
orb.run();
} catch (Exception e) {
System.err.println("ERROR: " + e);
e.printStackTrace(System.out);
}
}
}
4. 开发client端的代码
创建HelloWorldClient类来调用server的方法:
package Client;
import sample.HelloWorld;
import sample.HelloWorldHelper;
import org.omg.CORBA.ORB;
import org.omg.CORBA.ORBPackage.InvalidName;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import org.omg.CosNaming.NamingContextPackage.CannotProceed;
import org.omg.CosNaming.NamingContextPackage.NotFound;
public class HelloWorldClient {
static HelloWorld helloWorld;
static {
System.out.println("client开始连接server.......");//连接测试
//初始化ip和端口号,-ORBInitialHost 127.0.0.1 -ORBInitialPort 1050
String args[] = new String[4];
args[0] = "-ORBInitialHost";
//server端的IP地址,在HelloServer中定义的
args[1] = "127.0.0.1";
args[2] = "-ORBInitialPort";
//server端的端口,在HelloServer中定义的
args[3] = "1050";
//创建一个ORB实例
ORB orb = ORB.init(args, null);
// 获取根名称上下文
org.omg.CORBA.Object objRef = null;
try {
objRef = orb.resolve_initial_references("NameService");
} catch (InvalidName e) {
e.printStackTrace();
}
NamingContextExt neRef = NamingContextExtHelper.narrow(objRef);
String name = "Hello";
try {
//通过ORB拿到了server实例化好的实现类
helloWorld = HelloWorldHelper.narrow(neRef.resolve_str(name));
} catch (NotFound e) {
e.printStackTrace();
} catch (CannotProceed e) {
e.printStackTrace();
} catch (org.omg.CosNaming.NamingContextPackage.InvalidName e) {
e.printStackTrace();
}
System.out.println("client connected server.......");
}
public static void main(String args[]) throws Exception {
sayHello("");
}
//调用实现类的方法
public static void sayHello(String name) {
//String str[] = helloWorld.sayHello();
//String str=helloWorld.sayHello();
//System.out.print(helloWorld.sayHello());
String str=helloWorld.sayHello();
System.out.println(str);
}
}
服务端与客户端配置好之后,需要在命令行输入命令来启动服务:
cd /d %JAVA_HOME%\bin
orbd -ORBInitialPort 1050 -ORBInitialHost 127.0.0.1来启动服务
服务端测试:输出HelloWorld is running.
客户端测试,成功输出“Hello,World!+班级+中文姓名”字符串
以上测试程序成功。