RMI远程方法调用demo,适合新手

1.先简单了解RPCRMI的区别

RMI即远程方法调用,应用场景:本地有一个JAVA程序,需要调用一个方法,然而该方法可能很复杂,只有远程的机器上才有,这时候就需要通过RMI机制来调用。调用的过程也很简便,远程机器提供接口,本地只需要根据接口的形式提供对应的参数就可以。通讯的过程对客户端是透明的。

2.Demo1:实现本地调用远程方法进行相加add,采用值传递

(1)客户端需要的程序:

IHello.java (远程机器提供的接口)

HelloClient.java(客户端程序)

 

(2)服务器端需要的程序:

IHello.java (远程机器的接口)

HelloServer.java

HelloImpl(接口的实现)

 

(3)开发步骤

服务器端:

l 将接口在IHello.java文件中声明

[java]  view plain copy
  1. public interface IHello extends Remote {  
  2. public int add(int x, int y) throws RemoteException;  
  3. }  


接口续继承Remote,并且要抛出RemoteException异常

l 接口的实现,在HelloImpl.java中完成

[java]  view plain copy
  1. public class HelloImpl extends UnicastRemoteObject implements IHello {public int add(int x, int y) throws RemoteException {  
  2. return (x+y);  
  3. }  
  4. }  


l 主函数写在HelloServer.java

[java]  view plain copy
  1. IHello rhello = new HelloImpl();  
  2. LocateRegistry.createRegistry(7744);  
  3. Naming.bind("rmi://localhost:7744/RHello", rhello);  


将声明一个远程(remote`)对象,并将远程对象在服务器上注册,并将与一个uri绑定

客户端:

l 将服务器上的IHello.java接口文件拷贝到客户端

l 客户端的主程序卸载HelloClient.java

[java]  view plain copy
  1. IHello rhello = (IHello) Naming  
  2. .lookup("rmi://localhost:7744/RHello");  
  3. Scanner sc=new Scanner(System.in);  
  4. System.out.println("请输入要相加的值:");  
  5. int x1=sc.nextInt();  
  6. int y1=sc.nextInt();  
  7. System.out.println(rhello.add(x1,y1));  


客户端通过uri地址找到服务器创建的远程对象rhello,并调用远程方法。

运行结果:

 

注意:ClientServer的接口文件、包名需要一致

  

3.Demo2:采用远程方法进行数值交换,采用引用传递

JAVA中没有指针的概念,方法中传递的参数通常是值传递;然而值传递只是复制变量的数值,在远程服务器上执行后,本地的内存上没有任何变化,因此达不到数值交换的目的。

JAVA中引用传递可以采用对象,数组等。对象在网络上传递必须进行串行化,写入Bytes流中,并能够从Bytes流中读出。

服务器端:

l 进行引用传递创建的对象 S.java

[java]  view plain copy
  1. public class S implements Serializable{  
  2. private static final long serialVersionUID = 4765136455717773169L;  
  3. private int x,y;  
  4. ....  
  5. }  


l 在接口中IHello.java文件中增加方法的声明

[java]  view plain copy
  1. public S  swap2(S s) throws RemoteException;  


l 在HelloImpl.java中实现swap2方法

[java]  view plain copy
  1. public S swap2 (S s) throws RemoteException {...}  


客户端:

l 拷贝 S.java到客户端

l 拷贝 IHell.java到客户端

l 客户端主程序

S s=new S(0,1);

// 在RMI服务注册表中查找名称为RHello的对象,并调用其上的方法

[java]  view plain copy
  1. try {  
  2. IHello rhello = (IHello) Naming  
  3. .lookup("rmi://localhost:7744/RHello");  
  4. System.out.println("调用远程swap方法前:");  
  5. System.out.println(s.getX());  
  6. System.out.println(s.getY());  
  7. System.out.println("调用远程swap方法后:");  
  8. s=rhello.swap2(s);  
  9. System.out.println(s.getX());  
  10. System.out.println(s.getY());  
  11. }  


注意:ClientServer的对象的序列号需要一致

实验结果:

 


 

RMI Remote Method Invocation

RMI 采用stubs 和 skeletons 来进行远程对象(remote object)的通讯。stub 充当远程对象的客户端代理,有着和远程对象相同的远程接口,远程对象的调用实际是通过调用该对象的客户端代理对象stub来完成的,通过该机制RMI就好比它是本地工作,采用tcp/ip协议,客户端直接调用服务端上的一些方法。优点是强类型,编译期可检查错误,缺点是只能基于JAVA语言,客户机与服务器紧耦合。

 

RPCRemote Procedure Call Protocol

RPC使用C/S方式,采用http协议,发送请求到服务器,等待服务器返回结果。这个请求包括一个参数集和一个文本集,通常形成“classname.methodname”形式。优点是跨语言跨平台,C端、S端有更大的独立性,缺点是不支持对象,无法在编译器检查错误,只能在运行期检查。

 (1RPC 跨语言,而 RMI只支持Java

(2)RMI 调用远程对象方法,允许方法返回 Java 对象以及基本数据类型,而RPC 不支持对象的概念

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值