欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

基于RMI的矩阵运算

程序员文章站 2022-03-05 14:47:42
...

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

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