JAVA RMI远程方法调用简单实例

RMI的概念

RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制。使用这种机制,某一台计算机上的对象可以调用另外 一台计算机上的对象来获取远程数据。RMI是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。在过去,TCP/IP套接字通讯是远程通讯的主要手段,但此开发方式没有使用面向对 象的方式实现开发,在开发一个如此的通讯机制时往往令程序员感觉到乏味,对此RPC(Remote Procedure Call)应运而生,它使程序员更容易地调用远程程序,但在面对复杂的信息传讯时,RPC依然未能很好的支持,而且RPC未能做到面向对象调用的开发模 式。针对RPC服务遗留的问题,RMI出现在世人面前,它被设计成一种面向对象的通讯方式,允许程序员使用远程对象来实现通信,并且支持多线程的服务,这 是一次远程通讯的革命,为远程通信开辟新的里程碑。

 

RMI的开发步骤

  1. 先创建远程接口及声明远程方法,注意这是实现双方通讯的接口,需要继承Remote
  2. 开发一个类来实现远程接口及远程方法,值得注意的是实现类需要继承UnicastRemoteObject
  3. 通过javac命令编译文件,通过java -server 命令注册服务,启动远程对象
  4. 最后客户端查找远程对象,并调用远程方法

简单实例

首先为服务建立一个Model层,注意因为此对象需要现实进行远程传输,所以必须继承Serializable

[c-sharp]  view plain copy
  1. package rmi.model;  
  2. import java.io.Serializable;  
  3. //注意对象必须继承Serializable  
  4. public class PersonEntity implements Serializable {  
  5.     private int id;  
  6.     private String name;  
  7.     private int age;  
  8.     public void setId(int id) {  
  9.         this.id = id;  
  10.     }  
  11.     public int getId() {  
  12.         return id;  
  13.     }  
  14.     public void setName(String name) {  
  15.         this.name = name;  
  16.     }  
  17.     public String getName() {  
  18.         return name;  
  19.     }  
  20.     public void setAge(int age) {  
  21.         this.age = age;  
  22.     }  
  23.     public int getAge() {  
  24.         return age;  
  25.     }  
  26. }  

创建远程接口PersonService,注意远程接口需要继承Remote

[java]  view plain copy
  1. package rmi.service;  
  2. import java.rmi.Remote;  
  3. import java.rmi.RemoteException;  
  4. import java.util.List;  
  5. import rmi.model.*;  
  6. //此为远程对象调用的接口,必须继承Remote类  
  7. public interface PersonService extends Remote {  
  8.     public List<PersonEntity> GetList() throws RemoteException;  
  9. }  

建立PersonServiceImpl实现远程接口,注意此为远程对象实现类,需要继承UnicastRemoteObject

[java]  view plain copy
  1. package rmi.serviceImpl;  
  2. import java.rmi.RemoteException;  
  3. import java.rmi.server.UnicastRemoteObject;  
  4. import java.util.LinkedList;  
  5. import java.util.List;  
  6. import rmi.model.PersonEntity;  
  7. import rmi.service.*;  
  8. //此为远程对象的实现类,须继承UnicastRemoteObject  
  9. public class PersonServiceImpl extends UnicastRemoteObject implements PersonService {  
  10.     public PersonServiceImpl() throws RemoteException {  
  11.         super();  
  12.         // TODO Auto-generated constructor stub  
  13.     }  
  14.     @Override  
  15.     public List<PersonEntity> GetList() throws RemoteException {  
  16.         // TODO Auto-generated method stub  
  17.         System.out.println("Get Person Start!");  
  18.         List<PersonEntity> personList=new LinkedList<PersonEntity>();  
  19.           
  20.         PersonEntity person1=new PersonEntity();  
  21.         person1.setAge(25);  
  22.         person1.setId(0);  
  23.         person1.setName("Leslie");  
  24.         personList.add(person1);  
  25.           
  26.         PersonEntity person2=new PersonEntity();  
  27.         person2.setAge(25);  
  28.         person2.setId(1);  
  29.         person2.setName("Rose");  
  30.         personList.add(person2);  
  31.           
  32.         return personList;  
  33.     }  
  34.       
  35. }  

建立服务器端,在服务器端注册RMI通讯端口与通讯路径,然后通讯javac命令编译文件,通过java -server 命令注册服务。以下面代码为例,如果阁下将项目建立于D://RMI/RemotingService文件夹上时,则先输入D://RMI /RemotingService/src>javac rmi/remotingservice/Program.java获取Program.class(如何阁下使用的MyEclipse等开发工具,可跳 过此步,直接在*/bin文件夹中直接调用已经生成的Program.class),然后输入D://RMI/RemotingService /src>java rmi/remotingservice/Program启动服务。

[java]  view plain copy
  1. package rmi.remotingservice;  
  2. import java.rmi.Naming;  
  3. import java.rmi.registry.LocateRegistry;  
  4.    
  5. import rmi.service.*;  
  6. import rmi.serviceImpl.*;  
  7. public class Program{  
  8.     public static void main(String[] args) {  
  9.         // TODO Auto-generated method stub  
  10.         try {  
  11.             PersonService personService=new PersonServiceImpl();  
  12.             //注册通讯端口  
  13.             LocateRegistry.createRegistry(6600);  
  14.             //注册通讯路径  
  15.             Naming.rebind("rmi://127.0.0.1:6600/PersonService", personService);  
  16.             System.out.println("Service Start!");  
  17.         } catch (Exception e) {  
  18.             // TODO Auto-generated catch block  
  19.             e.printStackTrace();  
  20.         }  
  21.     }  
  22. }  

最后建立客户端进行测试,注意客户调用的RMI路径必须服务器配置一致

[java]  view plain copy
  1. package rmi.remotingclient;  
  2. import java.rmi.Naming;  
  3. import java.util.List;  
  4. import rmi.model.PersonEntity;  
  5. import rmi.service.*;  
  6. public class Program {  
  7.     public static void main(String[] args){  
  8.         try{  
  9.             //调用远程对象,注意RMI路径与接口必须与服务器配置一致  
  10.             PersonService personService=(PersonService)Naming.lookup("rmi://127.0.0.1:6600/PersonService");  
  11.             List<PersonEntity> personList=personService.GetList();  
  12.             for(PersonEntity person:personList){  
  13.                 System.out.println("ID:"+person.getId()+" Age:"+person.getAge()+" Name:"+person.getName());  
  14.             }  
  15.         }catch(Exception ex){  
  16.             ex.printStackTrace();  
  17.         }  
  18.     }  
  19. }  

 

常见错误

  1. 在命令提示符调用java命令时,显示并无此命令。这是因为未在“环境变量”中绑定JAVA的JDK命令造成的,你首先单击“计算机右 键”->“属性”->“高级”->“环境变量”。在系统变量Path设置中加载为JDK的路径  .;D:/Program Files/Genuitec/Common/binary/com.sun.java.jdk.win32.x86_1.6.0.013/bin。然后 在ClassPath加载服务器端的Program.class地址 .;D://RMI/RemotingService/bin
  2. 在调用javac命令时出现“javac 找不到文件 ..... ”此错误,可能是因为阁下输入的文件路径出现错误造成,注意不要把D://RMI/RemotingService/src>javac rmi/ remotingservice/ Program.java写错为D://RMI/RemotingService/src>javac rmi. remotingservice.Program.java
  3. 在调用D://RMI/RemotingService/bin>java rmi/remotingservice/Program命令时出现“Exception in thread 'main' java.lang.NoClassEdfoundError”错误,第一这可能是阁下把Program 错写为Program.class ,注意java命令不需要加后缀名。第二可能是阁下把“java rmi/ remotingservice/Program”错写为“java rmi/ remotingservice/ Program"。
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
摘 要 伴随着人才教学的关注度越来越高,对于人才的培养也是当今社会发展的最为重要的问题之一。为了进一步的进行人才的培养关工作,许多的学校或者是教育的机构逐步的开展了网络信息化的教学和和管理工作,通过信息化的手段和技术实现网络信息化的教育及管理模式,通过网络信息化的手段实现在线答题在线考试和学生信息在线的管理等操作。这样更加的快捷解决了人才培养之中的问题,也在进一步的促进了网络信息化教学方式的快速的发展工作。相较于之前的人才教育和培养工作之中,存在这许多的问题和局限性。在学生信息管理方面通过线下管理的形式进行学生信息的管理工作,在此过程之中存在着一定的局限性和低效性,往往一些突发的问题导致其中工作出现错误。导致相关的教育工作受到了一定的阻碍。在学生信息和学生成绩的管理方面,往常的教育模式之下都是采用的是人工线下的进行管理和整理工作,在这一过程之中存在这一定的不安全和低效性,面对与学生基数的越来越大,学生的信息管理也在面领着巨大的挑战,管理人员面领着巨大的学生信息的信息量,运用之前的信息管理方式往往会在统计和登记上出现错误的情况的产生,为后续的管理工作造成了一定的困难。然而通过信息化的管理方式进行对学生信息的管理不仅可以避免这些错误情况的产生还可以进一步的简化学生信息管理工作的流程,节约了大量的人力和物力的之处。在线答题系统的实现不仅给学生的信息管理工作和在线考试带来了方便也进一步的促进了教育事业信息化的发展,从而实现高效化的教学工作。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值