CORBA版HelloWorld
来源:互联网 发布:2017淘宝卖什么成本低 编辑:程序博客网 时间:2024/06/08 01:48
CORBA,是一个很古老的技术,甚至诞生于Java之前,不过随着WebService、SOA、RMI等等技术的出现,CORBA由于过于复杂而渐渐淡出了人们的视线,不过在一些交互性很强的系统异构应用领域,CORBA似乎很重要,比如中国联通、移动、美国的数字电视系统应用领域,是CORBA把整个系统核心部分集成起来的。如果没有异构的、需要预留标准接口的、交互性很强的应用,你不应该考虑使用COBRA。
CORBA目前的最近版本规范是3.2,Java1.5、1.6均支持该版本。
CORBA比较亲和C++,对Java程序员来说,开始CORBA应用难度比较大,以至于网上找一个真正能跑的HelloWorld都很难。
下面是我经过阅读SUN的CORBA文档,所做的一个完整的HelloWorld实例:
一、定义IDL
IDL介绍
全称:Interface Description Language
使用Java(TM)编写的API提供基于标准的和CORBA的交互性和连接性。
用于描述接口,类似于PRC的.x文件。接口定义语言类似一个协议,来规定接入对象的行为。
用RPC / COM / CORBA技术来编写分布式系统时都需要接口定义语言(IDL)。
特点:
1、IDL是一种规范语言。
2、IDL看上去很像C语言。
3、OMG IDL的目的是定义接口和精简分布对象的过程。
4、IDL分离对象的接口与其实现。
5、IDL剥离了编程语言和硬件的依赖性。
6、使用IDL定义接口的客户机程序员不知道接口背后的实现细节。
7、IDL提供一套通用的数据类型,并以这些数据类型来定义更为复杂的数据类型。
IDL的语法需要的话可以专门的去学习,这里不是我介绍的重点。
module HelloApp{ interface Hello{ string sayHello(); oneway void shutdown(); }; };
没有IDL的专门的开发工具,写起来容易出错,而且不美观,IDEA勉强支持语法高亮,但不支持格式化和语法校验!
二、从IDL生成存根
idlj命令介绍
idlj命令是把idl文件生成java代码,此命令在JDK的安装目录的bin目录下可以找到
idlj命令的使用语法如下:
idlj [选项] < idl文件>
其中,< idl 文件> 是包含 IDL 定义的文件的名称,而[选项] 是以下所列选项的任一组合。这些选项是可选的,并且可以以任意顺序显示;< idl 文件> 是必须的并且必须显示在最后。
选项:
进入IDL文件存放目录,然后执行:idlj -fall Hello.idl
会生成一批Java文件:
helloCorba\src\HelloAppHelloPOA.java _HelloStub.java HelloHolder.java HelloHelper.java Hello.java HelloOperations.java
三、实现IDL接口,开发服务端程序
import HelloApp.Hello; import HelloApp.HelloHelper; import HelloApp.HelloPOA; import org.omg.CORBA.ORB; import org.omg.CosNaming.NameComponent; import org.omg.CosNaming.NamingContextExt; import org.omg.CosNaming.NamingContextExtHelper; import org.omg.PortableServer.POA; import org.omg.PortableServer.POAHelper; class HelloImpl extends HelloPOA { private ORB orb; public void setORB(ORB orb_val) { orb = orb_val; } // implement sayHello() method public String sayHello() { return "\nHello world !!\n"; } // implement shutdown() method public void shutdown() { orb.shutdown(false); } } public class HelloServer { 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 the 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 (Exception e) { System.err.println("ERROR: " + e); e.printStackTrace(System.out); } System.out.println("HelloServer Exiting ..."); } }
四、实现CORBA的客户端
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("Obtained a handle on server object: " + helloImpl); System.out.println(helloImpl.sayHello()); helloImpl.shutdown(); } catch (Exception e) { System.out.println("ERROR : " + e); e.printStackTrace(System.out); } }}
五、运行
1)运行CORBA服务
orbd -ORBInitialPort 1050 -ORBInitialHost 192.168.14.117
2)运行CORBA应用的服务端
java HelloServer -ORBInitialPort 1050
输出:
HelloServer ready and waiting ... HelloServer Exiting ...
3)运行CORBA应用的客户端
java HelloClient -ORBInitialHost 192.168.14.117 -ORBInitialPort 1050
Obtained a handle on server object: IOR:000000000000001749444c3a48656c6c6f4170702f48656c6c6f3a312e30000000000001000000000000008a000102000000000f3139322e3136382e31342e313137000006db000000000031afabcb00000000206d3bb80000000001000000000000000100000008526f6f74504f410000000008000000010000000014000000000000020000000100000020000000000001000100000002050100010001002000010109000000010001010000000026000000020002 Hello world !!
呵呵,很垃圾吧,但是客户要,我们就做!
太费劲了,如果做一个接口很复杂,参数很多,自定义类型不少的CORBA应用,复杂度将很好,如果经常改,那就更加郁闷了。
本文出自 “熔 岩” 博客,请务必保留此出处http://lavasoft.blog.51cto.com/62575/240268
http://lavasoft.blog.51cto.com/62575/240268/
http://www.cnblogs.com/java-pan/archive/2012/07/08/corba.html
下面是我自己开的一个微信公众号 [瞬息之间],除了写技术的文章、还有产品的、行业和人生的思考,希望能和更多走在这条路上同行者交流,有兴趣可关注一下,谢谢。
- CORBA版HelloWorld
- CORBA版HelloWorld
- CORBA版HelloWorld
- C++、CORBA版HelloWorld程序
- C++、CORBA版HelloWorld程序
- JAVA、CORBA版HelloWorld程序
- 转JAVA、CORBA版HelloWorld程序
- JAVA版CORBA程序1——HelloWorld
- 使用java实现基于corba的helloworld
- CORBA的简单介绍及HelloWorld
- Eclipse下搭建Corba开发环境+HelloWorld实现过程
- corba
- CORBA
- corba
- corba
- CORBA
- CORBA
- CORBA
- Android 使用EventBus实现菜单
- 海量数据处理经典思想
- 深度学习与自然语言处理(1)_斯坦福cs224d Lecture 1
- 【计算机网络 第五版】阅读笔记之四:网络层
- OpenCV优化:图像的遍历4种方式
- CORBA版HelloWorld
- 用NSUserDefaults保存和读取程序设置
- 前端面试知识点及答案
- android自定义控件系列
- linux关于执行文件路径的变量$PATH
- 【BZOJ2654】tree【二分】【最小生成树】
- Cocos2dx的ZOrder见解
- 【计算机网络 第五版】阅读笔记之五:运输层
- 【牛腩新闻发布系统】IIS发布过程中遇到的一些问题