基于 RMI/IIOP 的分布式一元二次方程求解系统

摘要:本篇文章将会介绍如何基于RMI和IIOP协议实现分布式系统求解一元二次方程,其间将会介绍RMI/IIOP的简单概念,以及一元二次方程分布式求解系统的实现步骤

作者:赵文奕 时间:2016.05.20

RMI//IIOP

* RMI

RMI(Remote Method Invocation)以Java为核心,可与采用本机方法与现有系统相连接。这就是说,RMI可采用自然、直接和功能全面的方式为您提供分布式计算机技术,而这种技术可帮助您以不断递增和无缝的方式为整个系统添加Java功能。

* IIOP

IIOP,Internet Inter-ORB Protocol(互联网内部对象请求代理协议),它是一个用于CORBA 2.0及兼容平台上的协议。用来在CORBA对象请求代理之间交流的协议。Java中使得程序可以和其他语言的CORBA实现实现互操作性的协议。

*RMI/ IIOP

RMI-IIOP出现以前,只有RMI和CORBA两种选择来进行分布式程序设计,二者之间不能协作。RMI-IIOP综合了RMI 和CORBA的优点,克服了他们的缺点,使得程序员能更方便的编写分布式程序设计,实现分布式计算。

首先,RMI-IIOP综合了RMI的简单性和CORBA的多语言性兼容性,其次RMI-IIOP克服了RMI只能 用于Java的缺点和CORBA的复杂性(可以不用掌握IDL)。

分布式方程求解系统

实现原理

由于需要实现一个分布式求解方程系统,因此需要一台机器作为server端提供接口,需要一台机器作为client调用接口。基于RMI/IIOP实现远程接口调用
,需要该接口继承java.rmi.Remote,实现远程接口的类必须继承可移植远程对象 javax.rmi.PortableRemoteObject,这个类可以将接口的对象传递给client端,其无形参构造函数必须显式地抛出 java.rmi.RemoteException。在定义了接口以及接口的实现后,就需要分别在server 和client端定义对象绑定和对象传递程序,实现镜像代码,最终求解出方程的解。

基本步骤

  • 方程根的JAVA BEAN
    package rmiiiop_equation;
    public class RootJB implements java.io.Serializable
    {
    private boolean hasRealRoot;//是否有实根
    private double X1; //解1
    private double X2;//解2
    public double getX2() {
    return X2;
    }
    public void setX2(double X2) {
    this.X2 = X2;
    }
    public double getX1() {
    return X1;
    }
    public void setX1(double X1) {
    this.X1 = X1;
    }
    public boolean isHasRealRoot() {
    return hasRealRoot;
    }
    public void setHasRealRoot(boolean hasRealRoot) {
    this.hasRealRoot = hasRealRoot;
    }
    }

注意,需要将方程根的对象序列化才能以字节流的方式传递,因此要实现serializable类

  • 定义远程接口

      package rmiiiop_equation;
      import java.rmi.Remote;
      import java.rmi.RemoteException;
      public interface RootInterface extends Remote
      {
        public RootJB calRoots(double a,double b, double c) throws                   RemoteException;
      }
    

注意:远程接口必须实现 java.rmi.Remote,远程方法必须抛出 java.rmi.RemoteException。

  • 远程接口的实现

    package rmiiiop_equation;
    import java.rmi.RemoteException;
    import javax.rmi.PortableRemoteObject;
    public class RootImpl extends PortableRemoteObject implements               RootInterface
    {
        public RootImpl() throws RemoteException {
       super();
     }
    
     public RootJB calRoots(double a, double b, double c) throws         RemoteException {
     double delta,x1,x2;
     delta = b*b-4*a*c;
     RootJB roots = new RootJB();
     if(delta<0)
     {
       roots.setHasRealRoot(false);
     }
     else
     {
     x1=(-b+Math.sqrt(delta))/(2*a);
     x2=(-b-Math.sqrt(delta))/(2*a);
     roots.setX1(x1);
     roots.setX2(x2);
     roots.setHasRealRoot(true);
     }
    return roots;
     }
    }
    

实现远程接口的类必须继承可移植远程对象 javax.rmi.PortableRemoteObject,其无形
参构造函数必须显式地抛出 java.rmi.RemoteException。

  • server端程序
    package rmiiiop_equation;
    import javax.naming.Context;
    import javax.naming.InitialContext;
    public class Server {
    public static void main(String[] args)
    {
    try{
    System.setProperty("java.naming.factory.initial", "com.sun.jndi.cosnaming.CNCtxFactory");
    System.setProperty("java.naming.provider.url", "iiop://server address");
    Context node = new InitialContext();
    node.rebind("roots", new RootImpl());
    33
    System.out.println("Server is running.....");
    }catch(Exception ex){}
    }
    }

其中将server adress 改为server的ip地址

  • client程序

    package rmiiiop_equation;
    import javax.naming.Context;
    import javax.naming.InitialContext;
    import javax.rmi.PortableRemoteObject;
    import java.util.Hashtable;
    public class Client {
      public static void main(String[] args)
    {
     try{
    Hashtable env = new Hashtable();
    env.put(Context.INITIAL_CONTEXT_FACTORY,               "com.sun.jndi.cosnaming.CNCtxFactory");
    env.put(Context.PROVIDER_URL, "iiop://server ip adress");
    Context node = new InitialContext(env);
    Object obj = node.lookup("roots");
    RootInterface ro = (RootInterface)PortableRemoteObject.narrow(obj,         RootInterface.class);
    RootJB roots= ro.calRoots(5.7, 189.0, 7.1);
    if(roots.isHasRealRoot())
    {
       System.out.println("x1="+roots.getX1()+"\n"+"x2="+roots.getX2());
    }
    else
       System.out.println("This equation has no real roots.");
       }catch(Exception ex){}
    }
    }
    

将 server adress 改为server ip 地址

  • 文件编译
    在两台机器 A 和 B 上创建相同的文件夹:F:\Exp02\rmiiiop_equation,把上面所有的源代码文件复制到两台机器的对应的文件夹下,分别编译。假定机器 B 是服务器。

*编译过程

总结

以上就是基于RMI/IIOP实现分布式一元二次方程求解系统的基本原理和简单步骤,欢迎各位大牛指教。

©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 214,658评论 6 496
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 91,482评论 3 389
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 160,213评论 0 350
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 57,395评论 1 288
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 66,487评论 6 386
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 50,523评论 1 293
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 39,525评论 3 414
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,300评论 0 270
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 44,753评论 1 307
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,048评论 2 330
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,223评论 1 343
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 34,905评论 5 338
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,541评论 3 322
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,168评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,417评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,094评论 2 365
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,088评论 2 352

推荐阅读更多精彩内容