简介篇
RMI全称Remote Method Invocation(远程方法调用),是一种计算机之间对象互相调用对方函数,启动对方进程的一种机制,使用这种机制----采用stubs 和 skeletons 来进行远程对象(remote object)的通讯,某一台计算机上的对象在调用另外一台计算机上的方法时,使用的程序语法规则和在本地机上对象间的方法调用的语法规则一样。调用远程对象和调用本地对象同样方便。
RMI采用JRMP(Java Remote Method Protocol)通讯协议,是构建在TCP/IP协议上的一种远程调用方法。
RMI的组成:
(1) 远程服务的接口定义(JAVA中定义一个接口继承java.rmi.Remote)
(2) 远程服务接口的具体实现(JAVA中实现这个接口)
(3) 桩(Stub)和框架(Skeleton)文件(JAVA产生stub)
(4) 一个运行远程服务的服务器
(5) 一个RMI命名服务,它允许客户端去发现这个远程服务
(6) 类文件的提供者
(7) 一个需要这个远程服务的客户端程序
(其他的网上有很多)
学习篇
JAVA RMI看起来很简单,但是网上的资料很少。
现在大部分的IDE都是Eclipse我们不能在Eclipse中像一个JAVA应用程序那样来运行一个RMI程序。
下载EMI的Eclipse插件方便开发,下载地址:
http://www.genady.net/rmi/v20/downloads.html
插件的安装解压后将features和 plugins分别拷到eclipse的对应文件夹中。
这时重新启动Eclipse就可以看到工具栏上多了一个RMI的图标(如果你的是MyEclipse,可能要切换到JAVA视图-----在右上角上)。
你可以启动你的Local Registry。
默认绑定的端口是1099,要改变端口可以在右键时Run As/Run Configuration …弹出一个对话框中。选择RMI Application,然后右边选RMI registry/lounch a new rmiregistry下方的Start new registry port on后面输入你的端口。如下图所示:
然后Apply.
问题篇
1. java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve) 访问权限限制,因为RMI的服务需要授权,外部程序才能访问,所以我们要改动 jre的安全配置文件,来开放权限,具体如下: 打开你的jdk目录下的这个文件 C:\Program Files\Java\jdk1.5.0_04\jre\lib\security\java.policy 在文件最后加入下面代码grant {
permission java.net.SocketPermission "*:1024-65535","connect,accept";
permission java.net.SocketPermission "*:80","connect";
};
你可以编写一个computer.policy文件:
grant{
permission java.security.AllPermission;
};
然后在Eclipse中的配置如下:上面提到的对话框中划线部分:
2、java.rmi.ConnectException: Connection refused to host: 127.0.0.1; nested
exception is:
java.net.ConnectException: Connection refused: connect
这种错误可能是你的Regitry 的端口和你程序里面的绑定名字“rmi://127.0.0.1:1099/rmi1”中的端口
不一致。检查你的服务端程序和你的客户端程序中的访问端口和服务名一致。
3、java.rmi.ServerException: RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: org.xbeans.communication.rmi.receiver.******_Stub
java.rmi.NotBoundException: receiver1这种错误是你的Server.codebase没有指向的的stub所在
的位置:
4.retrieval object?
点击左下方的
5.rmi 服务端通知客户端?
这个问题想了很久,一种是接口方法是可以有返回值的。另外一种是把客户端的stub传过去,操作这个
stub就相当于操作客户端的方法。
谢谢参考