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框架,然后再进行矩阵相关的操作
这样,我们的需求就全部实现了。