打开APP
userphoto
未登录

开通VIP,畅享免费电子书等14项超值服

开通VIP
Corba 学习笔记 (一)

背景:项目上使用到了CORBA这个古老的东东,所以需要学习一下。

CORBA的一些资料,童鞋们可以自己看,我就不贴在这里了

<<CORBA百度百科>>

<<CORBA Programming with J2SE 1.4>>

<<CORBA Technology and the Java™ Platform Standard Edition>>  


按照我的理解,CORBA是一种技术,可以让你在一台机器上,通过CORBA进行远程调用。

例如我在机器A上写了一个函数,实现a+b,然后通过CORBA发布我的接口;那么在机器B上,通过CORBA相关接口,可以调用机器A上的实现。

目前有很多种远程调用技术,参见 http://www.open-open.com/lib/view/open1353459989623.html


为什么项目中不使用新的远程调用技术/方案呢,主要是我们的代码是遗传下来的。。。。。。太坑了。。。。。。

JAVA Corba标准的实现主要有(我了解到的)JDK自己的实现,和Jacorb的实现,这里我就用JDK自带的做演示了...

用JDK写Corba程序和用Jacorb写有些许区别


万能的HelloWorld

代码一:写接口

首先需要些一个接口Interface,在接口里面定义你想要参与/允许/提供远程调用的方法。

规则:

    1. 这个接口必须继承java.rmi.Remote

    2. 公开的方法必须抛出RemoteException

  1. package com.corba;  
  2.   
  3. import java.rmi.Remote;  
  4. import java.rmi.RemoteException;  
  5.   
  6. public interface HelloInterface extends Remote {  
  7.     public void sayHello(String guest) throws RemoteException;  
  8. }  

代码二:实现接口

    注意:

    1. 继承PortableRemoteObject吧,如果不继承,那么需要写一堆初始化的东东...你可以去看下PortableRemoteObject构造函数的实现,太复杂了。通过简单继承PortableRemoteObject,HelloImpl这个类就可以用在基于IIOP协议的远程调用上了。

        原理:为了实现远程调用,我们每个实例化(new HelloImpl())都需要经过export和发布两个流程,这样远端才可以通过我们发布出去的实例,来进行调用。当然你也可以自己写export的代码。继承PortableRemoteObject后,你每一次实例化( new HelloImpl() )都会自动export

       构造函数中的super()是可以删除的,写上去只是为了提醒童鞋们,父类做了很多工作,不要忘了。

  1. package com.corba;  
  2.   
  3. import javax.rmi.PortableRemoteObject;  
  4.   
  5. public class HelloImpl extends PortableRemoteObject implements HelloInterface {  
  6.     public HelloImpl() throws java.rmi.RemoteException {  
  7.         super(); // invoke rmi linking and remote object initialization  
  8.     }  
  9.   
  10.     public void sayHello(String guestName) throws java.rmi.RemoteException {  
  11.         System.out.println("Hello, " + guestName + "!");  
  12.     }  
  13. }  

代码三:写Corba Server,发布服务

  1. package com.corba;  
  2.   
  3. import java.util.Properties;  
  4.   
  5. import javax.naming.Context;  
  6. import javax.naming.InitialContext;  
  7.   
  8. public class HelloServer {  
  9.     public static void main(String[] args) {  
  10.         try {  
  11.             // Step 1: Instantiate the Hello servant  
  12.             HelloImpl helloRef = new HelloImpl();  
  13.             // Step 2: Publish the reference in the Naming Service  
  14.             // using JNDI API  
  15.             Properties environment = new Properties();  
  16.             environment.setProperty("java.naming.factory.initial", "com.sun.jndi.cosnaming.CNCtxFactory");  
  17.             environment.setProperty("java.naming.provider.url", "iiop://localhost:1050");  
  18.             Context initialNamingContext = new InitialContext(environment);  
  19.             initialNamingContext.rebind("HelloService", helloRef);  
  20.   
  21.             System.out.println("Hello Server: Ready...");  
  22.         } catch (Exception e) {  
  23.             e.printStackTrace();  
  24.         }  
  25.     }  
  26. }  

代码四:测试客户端,用于测试上面提供的接口


  1. package com.corba;  
  2.   
  3. import java.util.Properties;  
  4.   
  5. import javax.naming.Context;  
  6. import javax.naming.InitialContext;  
  7. import javax.rmi.PortableRemoteObject;  
  8.   
  9. public class HelloClient {  
  10.   
  11.     public static void main(String args[]) {  
  12.         try {  
  13.             Properties environment = new Properties();  
  14.             environment.setProperty("java.naming.factory.initial", "com.sun.jndi.cosnaming.CNCtxFactory");  
  15.             environment.setProperty("java.naming.provider.url", "iiop://localhost:1050");  
  16.             Context initialNamingContext = new InitialContext(environment);  
  17.   
  18.             Object objref = initialNamingContext.lookup("HelloService");  
  19.             HelloInterface hi = (HelloInterface) PortableRemoteObject.narrow(objref, HelloInterface.class);  
  20.             System.out.println("Client: Obtained a ref. to Hello server.");  
  21.   
  22.             hi.sayHello(" MARS ");  
  23.         } catch (Exception e) {  
  24.             e.printStackTrace();  
  25.         }  
  26.     }  
  27. }  


执行:

1.首先启动orbd服务, orbd端口为1050


2.运行HelloServer

运行HelloServer的时候会报错:

java.rmi.StubNotFoundException: Stub class not found: com.corba.HelloImpl_Stub; nested exception is:

  1. java.lang.ClassNotFoundException: com.corba.HelloImpl_Stub  

这是由于我们没有生成HelloImpl的辅助类(封装了Corba协议调用JAVA的细节)

生成方式如下:

a) 进入class目录(我建的是maven工程,如果是JAVA Project,那么class目录在CorbaHelloWorld/bin目录下),执行生成stub的命令  rmic -iiop com.corba.HelloImpl

b) 进入class所在目录,查看stub是否生成


c) 现在可以运行HelloServer了

3. 运行HelloClient


4. Server端的输出










本站仅提供存储服务,所有内容均由用户发布,如发现有害或侵权内容,请点击举报
打开APP,阅读全文并永久保存 查看更多类似文章
猜你喜欢
类似文章
【热】打开小程序,算一算2024你的财运
Java RMI-IIOP 入门
J2EE的客户端
Java 8 中所有的包列表及介绍
RMI-IIOP
Tutorial: Getting Started Using RMI-IIOP
jndi和rmi的集成。
更多类似文章 >>
生活服务
热点新闻
分享 收藏 导长图 关注 下载文章
绑定账号成功
后续可登录账号畅享VIP特权!
如果VIP功能使用有故障,
可点击这里联系客服!

联系客服