基于 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实现分布式一元二次方程求解系统的基本原理和简单步骤,欢迎各位大牛指教。

你可能感兴趣的:(基于 RMI/IIOP 的分布式一元二次方程求解系统)