基于RMI的矩阵运算

Java RMI:Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。
我们知道,RMI时java实现分布式的一种方式,虽然不是最好,但是确实最容易理解和掌握的方式。
关于矩阵,大家可能都了解。用java来实现一个矩阵可是很麻烦的事。但是java凭借其强大的扩展性,有人专门为Java的开发了一款矩阵库。jama矩阵库
下面我们来看一下需求:
设计一个或者多个远程对象,能够计算矩阵加法、矩阵乘法以及矩阵数乘运算
在服务器端运行远程对象
定义一个矩阵类,可以表示任意的M*N矩阵
客户端通过RMI方法,将矩阵发送到服务端进行计算,服务端将结果返回客户端,客户端将结果显示在控制台。

这是一个矩阵类,继承自Jama.Matrix类
public class Matrix extends Jama.Matrix {
    //    Jama.Matrix实现了序列化接口
    public Matrix(int i, int i1) {
        super(i, i1);

    }

    public Matrix(int i, int i1, double v) {
        super(i, i1, v);
    }

    public Matrix(double[][] doubles) {
        super(doubles);
    }

    public Matrix(double[][] doubles, int i, int i1) {
        super(doubles, i, i1);
    }

    public Matrix(double[] doubles, int i) {
        super(doubles, i);
    }
}

下面我们来定义一个矩阵运算接口

//设计一个或者多个远程对象,能够计算矩阵加法、矩阵乘法以及矩阵数乘运算
//全部方法返回为Object
继承自Remote接口要抛出RemoteException
public interface MatrixManipulation extends Remote {
    /*矩阵加法
    * */
    Object matrixAdd(Matrix a, Matrix b)throws RemoteException;
    /*矩阵乘法
    * */
    Object matrixMultiplication(Matrix a, Matrix b)throws RemoteException;
    /*矩阵数乘
    times为标量
    * */
    Object matrixScalar(Matrix a,double times)throws RemoteException;
}
然后我们看看接口实现类
/*继承UnicastRemoteObject实现构造方法,
实现矩阵运算操作接口
*返回Object为矩阵的克隆对象
* */
public class MatrixManipulationImpl extends UnicastRemoteObject implements MatrixManipulation {
    private Matrix matrix;
    protected MatrixManipulationImpl() throws RemoteException {
    }

    protected MatrixManipulationImpl(int port) throws RemoteException {
        super(port);
    }

    protected MatrixManipulationImpl(int port, RMIClientSocketFactory csf, RMIServerSocketFactory ssf) throws RemoteException {
        super(port, csf, ssf);
    }

    @Override
    public Object matrixAdd(Matrix a, Matrix b) throws RemoteException {
        matrix=a.plus(b);
        return matrix.clone();
    }

    @Override
    public Object matrixMultiplication(Matrix a,  Matrix b) throws RemoteException {
        matrix=a.times(b);
        return matrix.clone();
    }

    @Override
    public Object matrixScalar(Matrix a, double times) throws RemoteException {
        matrix=a.times(times);
        return matrix.clone();
    }
}

最后是服务端

public class Operator {
//    服务端
    private static MatrixManipulation manipulation;
    public static void main(String[] args) {
//        i:行,i1:列;【行是水平方向的一横行bai,列是垂直方向上的一竖列du】

        try {
//            实例化
            manipulation=new MatrixManipulationImpl();
//            实例化注册表,监听9999端口
            Registry registry= LocateRegistry.createRegistry(1099);
//            绑定远程对象
            registry.rebind("manipulation",manipulation);
            System.out.println("RMI服务端运行......");
        } catch (RemoteException e) {
            e.printStackTrace();
        }
    }
}

客户端代码

import Jama.Matrix;

import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;

public class Client {
    private static Matrix a;
    private static Matrix b;
    private static Matrix matrix;
    public static void main(String[] args) {
//        实例化矩阵
         a=new Matrix(3,4);
         b=new Matrix(3,4);
//        (1,1,9)设置值为9
        a.set(1,1,9);
        try {
//            获取注册表,当为本机服务端时,host可以为空
            Registry registry= LocateRegistry.getRegistry(null);
//             查找服务端中的远程对象,并赋值给manipulation
            MatrixManipulation manipulation= (MatrixManipulation) registry.lookup("manipulation");
//            matrixAdd方法返回为矩阵克隆对象,所以用object来接受
            Object object= manipulation.matrixAdd(a,b);
//            将object对象向下转型
            matrix= (Matrix) object;
//            调用print方法,打印矩阵
            matrix.print(1,2);
        } catch (RemoteException | NotBoundException e) {
            e.printStackTrace();
        }
    }
}

总结:首先需要实现RMI框架,然后再进行矩阵相关的操作

这样,我们的需求就全部实现了。

  • 7
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值