基于 RMI/IIOP 的分布式一元二次方程求解系統(tǒng)

摘要:本篇文章將會介紹如何基于RMI和IIOP協(xié)議實現(xiàn)分布式系統(tǒng)求解一元二次方程,其間將會介紹RMI/IIOP的簡單概念,以及一元二次方程分布式求解系統(tǒng)的實現(xiàn)步驟

作者:趙文奕 時間:2016.05.20

RMI//IIOP

* RMI

RMI(Remote Method Invocation)以Java為核心,可與采用本機方法與現(xiàn)有系統(tǒng)相連接。這就是說,RMI可采用自然、直接和功能全面的方式為您提供分布式計算機技術(shù),而這種技術(shù)可幫助您以不斷遞增和無縫的方式為整個系統(tǒng)添加Java功能。

* IIOP

IIOP,Internet Inter-ORB Protocol(互聯(lián)網(wǎng)內(nèi)部對象請求代理協(xié)議),它是一個用于CORBA 2.0及兼容平臺上的協(xié)議。用來在CORBA對象請求代理之間交流的協(xié)議。Java中使得程序可以和其他語言的CORBA實現(xiàn)實現(xiàn)互操作性的協(xié)議。

*RMI/ IIOP

RMI-IIOP出現(xiàn)以前,只有RMI和CORBA兩種選擇來進行分布式程序設(shè)計,二者之間不能協(xié)作。RMI-IIOP綜合了RMI 和CORBA的優(yōu)點,克服了他們的缺點,使得程序員能更方便的編寫分布式程序設(shè)計,實現(xiàn)分布式計算。

首先,RMI-IIOP綜合了RMI的簡單性和CORBA的多語言性兼容性,其次RMI-IIOP克服了RMI只能 用于Java的缺點和CORBA的復(fù)雜性(可以不用掌握IDL)。

分布式方程求解系統(tǒng)

實現(xiàn)原理

由于需要實現(xiàn)一個分布式求解方程系統(tǒng),因此需要一臺機器作為server端提供接口,需要一臺機器作為client調(diào)用接口。基于RMI/IIOP實現(xiàn)遠程接口調(diào)用
,需要該接口繼承java.rmi.Remote,實現(xiàn)遠程接口的類必須繼承可移植遠程對象 javax.rmi.PortableRemoteObject,這個類可以將接口的對象傳遞給client端,其無形參構(gòu)造函數(shù)必須顯式地拋出 java.rmi.RemoteException。在定義了接口以及接口的實現(xiàn)后,就需要分別在server 和client端定義對象綁定和對象傳遞程序,實現(xiàn)鏡像代碼,最終求解出方程的解。

基本步驟

  • 方程根的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;
    }
    }

注意,需要將方程根的對象序列化才能以字節(jié)流的方式傳遞,因此要實現(xiàn)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;
      }
    

注意:遠程接口必須實現(xiàn) java.rmi.Remote,遠程方法必須拋出 java.rmi.RemoteException。

  • 遠程接口的實現(xiàn)

    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;
     }
    }
    

實現(xiàn)遠程接口的類必須繼承可移植遠程對象 javax.rmi.PortableRemoteObject,其無形
參構(gòu)造函數(shù)必須顯式地拋出 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 上創(chuàng)建相同的文件夾:F:\Exp02\rmiiiop_equation,把上面所有的源代碼文件復(fù)制到兩臺機器的對應(yīng)的文件夾下,分別編譯。假定機器 B 是服務(wù)器。

*編譯過程

總結(jié)

以上就是基于RMI/IIOP實現(xiàn)分布式一元二次方程求解系統(tǒng)的基本原理和簡單步驟,歡迎各位大牛指教。

?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

友情鏈接更多精彩內(nèi)容