摘要:本篇文章將會介紹如何基于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)的基本原理和簡單步驟,歡迎各位大牛指教。