Java远程方法调用,RMI入门教程

、什么是RMI

     Java远程方法调用,即Java RMI(Java Remote Method Invocation)是Java编程语言里,一种用于实现远程过程调用的应用程序编程接口。它使客户机上运行的程序可以调用远程服务器上的对象。远程方法调用特性使Java编程人员能够在网络环境中分布操作。RMI全部的宗旨就是尽可能简化远程接口对象的使用。
     Java RMI极大地依赖于接口。在需要创建一个远程对象的时候,程序员通过传递一个接口来隐藏底层的实现细节。客户端得到的远程对象句柄正好与本地的根代码连接,由后者负责透过网络通信。这样一来,程序员只需关心如何通过自己的接口句柄发送消息。
     接口的两种常见实现方式是:最初使用JRMP(Java Remote Message Protocol,Java远程消息交换协议)实现;此外还可以用与CORBA兼容的方法实现。RMI一般指的是编程接口,也有时候同时包括JRMP和API(应用程序编程接口),而RMI-IIOP则一般指RMI接口接管绝大部分的功能,以支持CORBA的实现。
     最初的RMI API设计为通用地支持不同形式的接口实现。后来,CORBA增加了传值(pass by value)功能,以实现RMI接口。然而RMI-IIOP和JRMP实现的接口并不完全一致。

二、基本原理

     要实现网络机器间的通讯,首先得来看看计算机系统网络通信的基本原理,在底层层面上来看,网络通信需要做的就是将流从一台计算机传输到另一台计算机,基于传输协议和网络IO来实现,其中传输协议比较出名的有HTTP、TCP、UDP等等,HTTP、TCP、UDP都是基于sokect概念上为某种应用场景而扩展出的传输协议,网络IO,主要有bio、nio、aio三种方式,所有的分布式应用通讯都是基于这个原理而实现的,只是为了应用的易用,各种语言通常都会提供一些更为贴切应用易用的应用层协议。

三、开发步骤

     1、创建远程接口(须继承 java.rmi.Remote接口);
     2、实现远程接口(须继承 java.rmi.server.UnicastRemoteObject类);
     3、生成Stub和Skeleton;
     4、启动RMI注册服务;
     5、启动远程服务;
     6、客户端查找远程对象,并调用远程方法;

四、实例代码清单

    1、创建远程接口,继承java.rmi.Remote接口

view source print ?
01. 1 package com.cnblogs.javalouvre.service;
02. 2
03. 3 import java.rmi.RemoteException;
04. 4
05. 5 public interface GreetService extends java.rmi.Remote {
06. 6
07. 7     String sayHello(String name) throws RemoteException;
08. 8
09. 9 }


    2、实现远程接口,继承 java.rmi.server.UnicastRemoteObject类 

view source print ?
01. 1 package com.cnblogs.javalouvre.service;
02. 2
03. 3 import java.rmi.RemoteException;
04. 4
05. 5 public class GreetServiceImpl extends java.rmi.server.UnicastRemoteObject implements GreetService {
06. 6
07. 7     private static final long serialVersionUID = 3434060152387200042L;
08. 8
09. 9     public GreetServiceImpl() throws RemoteException {
10. 10         super();
11. 11     }
12. 12
13. 13     @Override
14. 14     public String sayHello(String name) throws RemoteException {
15. 15         return "Hello " + name;
16. 16     }
17. 17
18. 18 }


    3、生成Stub和Skeleton;

    要生成Stub和Skeleton,首先需要编译上述源文件得到类文件,然后执行rmic命令,具体如下

view source print ?
1. [root@oracle ~]#javac -source 1.6 -target 1.6 -d . *.java
2. [root@oracle ~]#rmic com.cnblogs.javalouvre.service.GreetServiceImpl

 
    4、注册服务

    注册服务执行rmiregistry命令,如下

view source print ?
1. [root@oracle ~]#rmiregistry

    5、启动服务

view source print ?
01. 1 package com.cnblogs.javalouvre.server;
02. 2
03. 3 import java.net.MalformedURLException;
04. 4 import java.rmi.AlreadyBoundException;
05. 5 import java.rmi.Naming;
06. 6 import java.rmi.RemoteException;
07. 7 import java.rmi.registry.LocateRegistry;
08. 8
09. 9 import com.cnblogs.javalouvre.service.GreetServiceImpl;
10. 10
11. 11 public class Server {
12. 12
13. 13     public static void main(String[] args) {
14. 14         try {
15. 15             LocateRegistry.createRegistry(1098);
16. 16             Naming.bind("rmi://10.108.1.138:1098/GreetService"new GreetServiceImpl());
17. 17         catch (RemoteException e) {
18. 18             e.printStackTrace();
19. 19         catch (MalformedURLException e) {
20. 20             e.printStackTrace();
21. 21         catch (AlreadyBoundException e) {
22. 22             e.printStackTrace();
23. 23         }
24. 24     }
25. 25
26. 26 }

    编译、启动服务

view source print ?
1. [root@oracle ~]#javac -source 1.6 -target 1.6 -d . Server.java
2. [root@oracle ~]#java -server com.cnblogs.javalouvre.server.Server


    6、客户端调用

view source print ?
01. 1 package com.cnblogs.javalouvre.client;
02. 2
03. 3 import java.net.MalformedURLException;
04. 4 import java.rmi.Naming;
05. 5 import java.rmi.NotBoundException;
06. 6 import java.rmi.RemoteException;
07. 7
08. 8 import com.cnblogs.javalouvre.service.GreetService;
09. 9
10. 10 public class Client {
11. 11
12. 12     public static void main(String[] args) {
13. 13         try {
14. 14             GreetService greetService = (GreetService) Naming.lookup("rmi://10.108.1.138:1098/GreetService");
15. 15             System.out.println(greetService.sayHello("Jobs"));
16. 16         catch (MalformedURLException e) {
17. 17             e.printStackTrace();
18. 18         catch (RemoteException e) {
19. 19             e.printStackTrace();
20. 20         catch (NotBoundException e) {
21. 21             e.printStackTrace();
22. 22         }
23. 23     }
24. 24
25. 25 }

    编译,执行

view source print ?
1. [root@oracle ~]#javac -source 1.6 -target 1.6 -d . Client.java
2. [root@oracle ~]#java -client com.cnblogs.javalouvre.client.Client
3. [root@oracle ~]#Hello Jobs

你可能感兴趣的:(Java远程方法调用,RMI入门教程)