RMI小例实战记录

19 篇文章 0 订阅
17 篇文章 0 订阅

一、关于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)过去客户机器就可以了,否则,客户机会错的。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值