博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
RMI(远程方法调用)介绍
阅读量:6517 次
发布时间:2019-06-24

本文共 1465 字,大约阅读时间需要 4 分钟。

hot3.png

本文简单介绍下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流程原理如下图:

00
1.rmi服务注册他的名字和IPRMI注册中心(bind)
2.rmi客户端通过IP和名字去RMI注册中心找相应的服务(lookup)
3.rmi Stub序列化调用的方法和参数编组后传给rmi Skeleton(call)
4.rmi skeleton执行stub的逆过程,调用真实的server类执行该方法(invocation)
5.rmi skeleton将调用函数的结果返回给stub(return)

 

 

 

切记:相关的类的包的路径要跟服务器一样

 

 

有了远程对象实现类,看服务端的启动逻辑,其中:

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

转载于:https://my.oschina.net/wuweixiang/blog/1789961

你可能感兴趣的文章
加强Eclipse代码自动提示的方法
查看>>
exchange online 用户疑问之许可证和用户数据归档
查看>>
QImage Mat IplImage 之间的相互转换
查看>>
使用eclipse与android studio 在开发自定义控件时的区别
查看>>
我的友情链接
查看>>
mysql学习笔记
查看>>
年年有鱼游戏Android源码项目
查看>>
java使用Iterator、for循环同步数据
查看>>
创建镜像iso文件
查看>>
Linux下创建软RAID5和RAID10实战
查看>>
C++类的存储
查看>>
ActiveReports 报表应用教程 (8)---交互式报表之动态过滤
查看>>
解决使用Handler时Can't create handler inside thread that has not called Looper.prepare()
查看>>
跟我一起学docker(四)--容器的基本操作
查看>>
磁化强度
查看>>
C/C++ 数据范围
查看>>
LVS+keepalived+nginx
查看>>
monkey如何通过uiautomatorviewer的bounds坐标点击控件
查看>>
第22章,mysql数据库-1
查看>>
【亲测】教你如何搭建 MongoDB 复制集 + 选举原理
查看>>