RMI小例实战记录
一、关于RMI
对于远程,有些时候会想到FTP,HTTP,NFS,IMAP.POP等这些协议,但这些都是主机之间移动文件和数据的信号。另外还有一个是一台主机运行另一台主机的程序,例如Telnet等。而RMI(Remote Method Invocation)正是这个类型。
远程/本地对象区别:远程的对象驻留在不同的虚拟机中,向远程方法传参数和返回结果。
?
二、RMI机制
对于这种思想的实现机制有三个:
对于简单类型:按值传递
对于实现Remote接口的对象:以远程引用传递,允许接收方法调用远程对象上的方法,这与向本地JAVA方法传递本地引用的方法相似。
对于没有实现Remote接口的对象:按值传递(序列化)
?
三、RMI分层
服务器程序----------------------------客户端程序骨架----------------------------桩过程引用 ----------------------------过程引用传输层--------Internet---------传输层?
这样的分层有点像网络的分层关系。
?
四、实例?
???? 1.服务器接口继承Remote
import java.rmi.* ;import java.rmi.server.*;public interface TestRMIServer extends Remote{public String getMessage(String str) throws RemoteException ;}????? 2.服务器继承UnicastRemoteObject并间接实现Remote(TestRMIServer接口)
import java.rmi.* ;import java.rmi.server.* ;public class TestRMIServerImpl extends UnicastRemoteObject implements TestRMIServer{public TestRMIServerImpl() throws RemoteException{super() ;}public String getMessage(String str) throws RemoteException {System.out.println(str) ;return "success" ;}public static void main(String arg[]){try{TestRMIServerImpl instance = new TestRMIServerImpl() ;Naming.rebind("test",instance) ;System.out.println("Server Registered") ;}catch(Exception e){System.out.println(e) ;}}}???? 3.编写TestClient类为客户端
import java.io.*;import java.rmi.*; public class TestClient{ public TestClient(){ try{ BufferedReader input=new BufferedReader(new InputStreamReader(System.in)); String s=input.readLine(); TestRMIServer testServer=(TestRMIServer)Naming.lookup("rmi://127.0.0.1/test"); String str=testServer.getMessage(s); System.out.print(str); }catch(Exception e){System.out.println(e);} } public static void main(String s[]){ new TestClient(); }} ???? 4.如下的步骤进行操作?
javac?对所有的类进行编译
rmic编译后会产生一个TestRMIServerImpl_Stub.class的文件(放在客户端的)
start rmiregistry看前的转载<转>网络编程RMI ,这个打开会有一个黑屏的。
policytool用的设置一些权限,具体如下
?由添加规则项目----》添加权限----》权权限,然后按下面这样选点确认与完成:
?????? 
?
????????? 
?
? 5.测试
java TestRMIServerImpl运行服务器
如下图运行客户端
???? 
出现上面的东西,这个实验成功了。
? 6.可能会出现的问题
???? 6.1当忘记开启注册表时,会出现下面的错误:
????????? 
?
???? 6.2 当没有开启服务器时,会出现这样的错误:
???????
?
?
好了,就这样了,如果用两个或更多机器去调用服务器的方法,在编译后的.class文体中,选三个复制(TestRMIServerImpl_Stub.class,TestRMIServer.class,TestClient.class)过去客户机器就可以了,否则,客户机会错的。