import java.rmi.Remote; import java.rmi.RemoteException; /** * 必须继承Remote接口。 * 所有参数和返回类型必须序列化(因为要网络传输)。 * 任意远程对象都必须实现此接口。 * 只有远程接口中指定的方法可以被调用。 */ public interface IRemoteMath extends Remote { // 所有方法必须抛出RemoteException public double add(double a, double b) throws RemoteException; public double subtract(double a, double b) throws RemoteException; }
(学习视频分享:java视频教程)
2. 远程接口实现类
import java.rmi.RemoteException; import java.rmi.server.UnicastRemoteObject; import remote.IRemoteMath; /** * 服务器端实现远程接口。 * 必须继承UnicastRemoteObject,以允许JVM创建远程的存根/代理。 */ public class RemoteMath extends UnicastRemoteObject implements IRemoteMath { private int numberOfComputations; protected RemoteMath() throws RemoteException { numberOfComputatiOns= 0; } @Override public double add(double a, double b) throws RemoteException { numberOfComputations++; System.out.println("Number of computations performed so far = " + numberOfComputations); return (a+b); } @Override public double subtract(double a, double b) throws RemoteException { numberOfComputations++; System.out.println("Number of computations performed so far = " + numberOfComputations); return (a-b); } }
3. 服务器端
import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import remote.IRemoteMath; /** * 创建RemoteMath类的实例并在rmiregistry中注册。 */ public class RMIServer { public static void main(String[] args) { try { // 注册远程对象,向客户端提供远程对象服务。 // 远程对象是在远程服务上创建的,你无法确切地知道远程服务器上的对象的名称, // 但是,将远程对象注册到RMI Registry之后, // 客户端就可以通过RMI Registry请求到该远程服务对象的stub, // 利用stub代理就可以访问远程服务对象了。 IRemoteMath remoteMath = new RemoteMath(); LocateRegistry.createRegistry(1099); Registry registry = LocateRegistry.getRegistry(); registry.bind("Compute", remoteMath); System.out.println("Math server ready"); // 如果不想再让该对象被继续调用,使用下面一行 // UnicastRemoteObject.unexportObject(remoteMath, false); } catch (Exception e) { e.printStackTrace(); } } }
4. 客户端
import java.rmi.registry.LocateRegistry; import java.rmi.registry.Registry; import remote.IRemoteMath; public class MathClient { public static void main(String[] args) { try { // 如果RMI Registry就在本地机器上,URL就是:rmi://localhost:1099/hello // 否则,URL就是:rmi://RMIService_IP:1099/hello Registry registry = LocateRegistry.getRegistry("localhost"); // 从Registry中检索远程对象的存根/代理 IRemoteMath remoteMath = (IRemoteMath)registry.lookup("Compute"); // 调用远程对象的方法 double addResult = remoteMath.add(5.0, 3.0); System.out.println("5.0 + 3.0 = " + addResult); double subResult = remoteMath.subtract(5.0, 3.0); System.out.println("5.0 - 3.0 = " + subResult); }catch(Exception e) { e.printStackTrace(); } } }
结果如下:
server端
参考:https://blog.csdn.net/xinghun_4/article/details/45787549