摘要:本篇文章将会介绍如何基于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实现分布式一元二次方程求解系统的基本原理和简单步骤,欢迎各位大牛指教。