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

  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

  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

  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. PersonEntity person1=new PersonEntity();
  20. person1.setAge(25);
  21. person1.setId(0);
  22. person1.setName("Leslie");
  23. personList.add(person1);
  24. PersonEntity person2=new PersonEntity();
  25. person2.setAge(25);
  26. person2.setId(1);
  27. person2.setName("Rose");
  28. personList.add(person2);
  29. return personList;
  30. }
  31. }

建立服务器端,在服务器端注册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启动服务。

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

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

  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"。

原代码下载

原文:http://blog.csdn.net/leslies2/article/details/6436847

JAVA RMI远程方法调用简单实例[转]的更多相关文章

  1. JAVA RMI远程方法调用简单实例(转载)

    来源:http://www.cnblogs.com/leslies2/archive/2011/05/20/2051844.html RMI的概念 RMI(Remote Method Invocati ...

  2. Java RMI 实现一个简单的GFS(谷歌文件系统)——介绍篇

    本系列主要是使用Java RMI实现一个简单的GFS(谷歌文件系统,google file system),首先整体简单介绍下该项目. [为了更好的阅读以及查看其他篇章,请查看原文:https://w ...

  3. Java RMI 实现一个简单的GFS(谷歌文件系统)——背景与设计篇

    目录 背景 系统设计 1. 系统功能 2. Master组件 2.1 命名空间 2.2 心跳机制 2.3 故障恢复和容错机制 3. ChunkServer组件 3.1 本地存储 3.2 内存命中机制 ...

  4. Java RMI(远程方法调用) 实例与分析 (转)

    目的: 通过本文,可以加深对Java RMI的理解,知道它的工作原理,怎么使用等. 也为了加深我自己的理解,故整理成文.不足之处,还望指出. 概念解释: RMI(RemoteMethodInvocat ...

  5. Java RMI(远程方法调用) 实例与分析

    目的: 通过本文,可以加深对Java RMI的理解,知道它的工作原理,怎么使用等. 也为了加深我自己的理解,故整理成文.不足之处,还望指出. 概念解释: RMI(RemoteMethodInvocat ...

  6. java rmi远程方法调用实例

    RMI的概念 RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制.使用这种机制,某一台计算机上的对象可以调用另外一台计 ...

  7. JAVA入门[18]-JdbcTemplate简单实例

    一.关于JdbcTemplate JdbcTemplate是最基本的Spring JDBC模板,这个模板支持简单的JDBC数据库访问功能以及基于索引参数的查询. Spring数据访问模板:在数据库操作 ...

  8. Java的Socket通信简单实例

    服务端 package testlxd; import java.io.BufferedReader; import java.io.IOException; import java.io.Input ...

  9. java中的反射简单实例

    package club.reflection.entity.User; /** * 实体类 * */ public class User { public String name; private ...

随机推荐

  1. 混沌数学之二维logistic模型

    上一节讲了logistic混沌模型,这一节对其扩充一下讲二维 Logistic映射.它起着从一维到高维的衔接作用,对二维映射中混沌现象的研究有助于认识和预测更复杂的高维动力系统的性态.通过构造一次藕合 ...

  2. App优化 Systrace

    简介 trace [tres] vt.跟踪,追踪; 追溯,探索; 探索; 查找; n.痕迹; 痕迹,踪迹; 微量,极少量; 1 1   1 trace [tres] vt.跟踪,追踪; 追溯,探索; ...

  3. RS错误RSV-VAL-0032之项目未在布局中引用的3种解决办法

    如下图所示,我用RS新建了一个空白页面,拖入了一个列表,给该列表新建了一个条件样式 条件样式如下所示,表达式来自查询1 运行,报错如下图所示 原因就是条件样式使用到了查询1中的数据项1但是数据项1在报 ...

  4. 通过page页面与portlet的结合实现报表的局部刷新

    场景:系统已经存在两个报表,报表A与B,A与B之间可以通过省份进行追溯. 如下图:点击 报表[销售数据按区域]中的北京市 追溯到报表[销售数据按省份] 需求:让上面的操作在一个page里面刷新,实现页 ...

  5. Immediately-Invoked Puzzler

    The Poplar Puzzle-makers weren’t too impressed. They barely noticed your simple and beautiful array ...

  6. photoshop 去掉gif水印

    先贴上未去除水印的GIF图片!~ 打开选中需要处理的“gif文件” 下面就以动图给大家介绍一下: 首先勾选 时间轴和图层 第二步(选择区域) 第三步(选择水印区域),选择完了以后按Enter 选中第一 ...

  7. Tomcat环境的搭建(web基础学习笔记一)

    一.下载和安装Tomcat服务器 下载Tomcat安装程序包:http://tomcat.apache.org/ 点击[Download]跳转到如下图所示的下载页面 二.点击左侧要下载的版本,选择To ...

  8. sql数据库表复制、查看是否锁表

    1.不同数据库之间复制表的数据的方法: 当表目标表存在时: insert into 目的数据库..表 select * from 源数据库..表 当目标表不存在时: select * into 目的数 ...

  9. kafka delete topic

    Don't think it is supported yet. Take a look at this JIRA tracking Delete Topic. For delete manually ...

  10. ASP.NET MVC+Bootstrap 实现短信验证

    短信验证大家都已经非常熟悉了,基本上每天都在接触手机短信的验证码,比方某宝,某东购物.站点注冊,网上银行等等,都要验证我们的手机号码真实性.这样做有什么优点呢. 曾经咱们在做站点的时候.为了提高用户注 ...