JAVA的Corba客户端 - 服务端 通信实现
IDE:Eclipse 3.4.1
先在Eclipse建立两个Java Project
1. 然后定义 IDL .
内容如下:
interface Hello {
string sayHello();
oneway void shutdown();
};
};
**这里注意, } 后面的 ";"一定要写上,不然会编译错误
2. 右键这个HelloApp.idl 文件
点击,Change to parent folder in Shell
点击OK , Eclipse会打开Shell视图,是命令行视图,其实和CMD是一个作用.
这里我们执行命令 : idlj -fall HellApp.idl
3. 然后我们到项目目录(H:\DEVELOPING\UMM\workspace\testCorbaServer\src\server) 下就能看到多生成了一个文件夹 -- helloapp
打开里面试一些java接口类
4. 在服务端建立一个package 名字跟 idl 内容里的module 相同, 这里我们是 ' helloapp '
然后把类复制到这个包下面
---------------------------------------
---------------------------------------
第二部分 实现IDL 生成的类的接口
1. 实现服务端 如图
内容如下:
import org.omg.CORBA.ORB;
import helloapp.HelloPOA;
public class HelloImpl extends HelloPOA {
private ORB orb;
public void setOrb(ORB orb) {
this.orb = orb;
}
@Override
public String sayHello() {
return "\nHello World!!\n";
}
@Override
public void shutdown() {
orb.shutdown(false);
}
}
以上, 服务端的" 服务" 就写好了, 下面还要在服务端写一个入口类, 把你的服务" 注册" 上.
内容如下:
import helloapp.Hello;
import helloapp.HelloHelper;
import org.omg.CORBA.ORB;
import org.omg.CORBA.ORBPackage.InvalidName;
import org.omg.CosNaming.NameComponent;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
import org.omg.CosNaming.NamingContextPackage.CannotProceed;
import org.omg.CosNaming.NamingContextPackage.NotFound;
import org.omg.PortableServer.POA;
import org.omg.PortableServer.POAHelper;
import org.omg.PortableServer.POAManagerPackage.AdapterInactive;
import org.omg.PortableServer.POAPackage.ServantNotActive;
import org.omg.PortableServer.POAPackage.WrongPolicy;
public class Main {
public static void main(String[] args) {
try {
// 创建一个ORB实例
ORB orb = ORB.init(args, null);
// 得到一个RootPOA的引用,并激活POAManager
POA rootpoa = POAHelper.narrow(orb
.resolve_initial_references("RootPOA"));
rootpoa.the_POAManager().activate();
// create servant and register it with ORB
// 创建一个HelloImpl实例(servant),并注册到ORB上
HelloImpl helloImpl = new HelloImpl();
helloImpl.setOrb(orb);
// 在服务中得到对象的引用
org.omg.CORBA.Object ref = rootpoa.servant_to_reference(helloImpl);
Hello href = HelloHelper.narrow(ref);
//得到一个根名称的上下文
org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
// Use NamingContextExt which is part of the Interoperable
// Naming Service (INS) specification.
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
// 在命名上下文中绑定这个对象
String name = "Hello";
NameComponent path[] = ncRef.to_name(name);
ncRef.rebind(path, href);
System.out.println("HelloServer ready and waiting ...");
//启动线程服务,等待客户端的调用
orb.run();
} catch (InvalidName e) {
e.printStackTrace();
} catch (AdapterInactive e) {
e.printStackTrace();
} catch (ServantNotActive e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (WrongPolicy e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (org.omg.CosNaming.NamingContextPackage.InvalidName e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (NotFound e) {
// TODO Auto-generated catch block
e.printStackTrace();
} catch (CannotProceed e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
System.out.println("HelloServer Exiting ...");
}
}
注意 :这里虽然是入口,可是不能直接右键run as - > Java Application
---------------------------------------
---------------------------------------
实现客户端
1. 要把服务端生成的工具类复制到客户端( 最好包结构一致) 如图
2. 编写客户端调用.
内容如下:
import helloapp.Hello;
import helloapp.HelloHelper;
import org.omg.CORBA.ORB;
import org.omg.CosNaming.NamingContextExt;
import org.omg.CosNaming.NamingContextExtHelper;
public class HelloClient {
static Hello helloImpl;
public static void main(String[] args) {
try {
// 创建一个ORB实例
ORB orb = ORB.init(args, null);
// 获取根名称上下文
org.omg.CORBA.Object objRef = orb.resolve_initial_references("NameService");
// Use NamingContextExt instead of NamingContext. This is
// part of the Interoperable naming Service.
NamingContextExt ncRef = NamingContextExtHelper.narrow(objRef);
// 从上下文中获取接口实现对象
String name = "Hello";
helloImpl = HelloHelper.narrow(ncRef.resolve_str(name));
System.out.println(helloImpl.sayHello());
System.out.println("asdfasdfdasf");
} catch (Exception e) {
e.printStackTrace();
}
}
}
这样 客户端就完成调用了. 下面就是如何 运行起来了.
1. 运行CORBA 服务 ( 直接CMD 运行即可)
orbd -ORBInitialPort 1053 -ORBInitialHost 192.168.1.42
注: 192.168.1.42 是我自己的本地IP地址 1053是端口
CORBA 服务独立于客户端和服务端,相当于一条桥梁.
这个窗口不要关掉,光标会一直闪.
2. 启动服务端
启动服务端需要main函数传递参数,所以我们要先配一些main函数的参数. 如图:
点开:
Main就是我们服务端的入口函数. 之前有说过.
然后在arguments的program arguments: 写入
-ORBInitialPort 1053
端口1053 是与之前的CORBA 服务的端口对应的
服务端就配好了. 运行服务端.
不要关闭服务端.
3. 启动客户端
这里我不用多说了,然后启动运行,就可以看到运行结果了.
说明: 依照原文,可能环境不同会出些奇怪的问题,希望读者先仔细检查是否和原文有出入,或者检查异常,还是不行的话,欢迎留言一起讨论.
思路来自于:参考自http://lavasoft.blog.51cto.com/62575/240268