本文简单介绍下RMI。即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。
1.RMI介绍
RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制。使用这种机制,某一台计算机上的对象可以调用另外一台计算机上的对象来获取远程数据。
RMI是针对JAVA有效的RPC,常用于一个jvm中调用另外一个jvm中的Service方法获得数据。
2.RMI原理:
RMI流程原理如下图:
1.rmi服务注册他的名字和IP到RMI注册中心(bind)
2.rmi客户端通过IP和名字去RMI注册中心找相应的服务(lookup)
3.rmi Stub序列化调用的方法和参数编组后传给rmi Skeleton(call)
4.rmi skeleton执行stub的逆过程,调用真实的server类执行该方法(invocation)
5.rmi skeleton将调用函数的结果返回给stub(return)
Java RMI(远程方法调用) 实例与分析
java远程调用rmi入门实例
切记:相关的类的包的路径要跟服务器一样
有了远程对象实现类,看服务端的启动逻辑,其中:
Registry rr = LocateRegistry.createRegistry(1234);
LocateRegistry类:用于创建或获取某端口的对象注册表
LocateRegistry.createRegistry:这个方法表示获得远程对象注册表引用,返回Registry对象
Registry:真正操作远程对象注册表的接口
接着,
rr.bind("testrmi", r);
利用Registry的对象,把刚刚创建的远程对象注册为名称testrmi. 这里还有一种写法,效果是一样的.
LocateRegistry.createRegistry(1234); //创建,如果已经创建了就可省略这一句Naming.bind("rmi://localhost:1234/testrmi", r);//需要带上端口
Naming:与对象注册表交互的工具类
上面是服务端从远程对象创建到对象注册的整个逻辑.客户端调用的逻辑比较简单,先通过Naming工具类获取到远程对象的引用以后,就可以正常使用了
(IRemote) Naming.lookup("rmi://localhost:1234/testrmi");
这里返回的"引用"和通常讲的对象引用不同,是远程对象的引用信息.拿到这个"引用"以后就可以像使用真正的对象一样调用其中的方法.
客户端再访问就会出现异常了,rmi所有远程方法都不能用了!
异常信息:java.rmi.NoSuchObjectException: no such object in table
答:
服务器端的服务对象被垃圾回收了。建议把服务对象变成静态成员。
public static ServerObject serverObject =new ServerObject ();
......
Naming.rebind(serverName, serverObject);