JAVA RMI远程方法调用简单实例[转]
RMI的概念
RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制。使用这种机制,某一台计算机上的对象可以调用另外 一台计算机上的对象来获取远程数据。RMI是Enterprise JavaBeans的支柱,是建立分布式Java应用程序的方便途径。在过去,TCP/IP套接字通讯是远程通讯的主要手段,但此开发方式没有使用面向对 象的方式实现开发,在开发一个如此的通讯机制时往往令程序员感觉到乏味,对此RPC(Remote Procedure Call)应运而生,它使程序员更容易地调用远程程序,但在面对复杂的信息传讯时,RPC依然未能很好的支持,而且RPC未能做到面向对象调用的开发模 式。针对RPC服务遗留的问题,RMI出现在世人面前,它被设计成一种面向对象的通讯方式,允许程序员使用远程对象来实现通信,并且支持多线程的服务,这 是一次远程通讯的革命,为远程通信开辟新的里程碑。
RMI的开发步骤
- 先创建远程接口及声明远程方法,注意这是实现双方通讯的接口,需要继承Remote
- 开发一个类来实现远程接口及远程方法,值得注意的是实现类需要继承UnicastRemoteObject
- 通过javac命令编译文件,通过java -server 命令注册服务,启动远程对象
- 最后客户端查找远程对象,并调用远程方法
简单实例
首先为服务建立一个Model层,注意因为此对象需要现实进行远程传输,所以必须继承Serializable
- package rmi.model;
- import java.io.Serializable;
- //注意对象必须继承Serializable
- public class PersonEntity implements Serializable {
- private int id;
- private String name;
- private int age;
- public void setId(int id) {
- this.id = id;
- }
- public int getId() {
- return id;
- }
- public void setName(String name) {
- this.name = name;
- }
- public String getName() {
- return name;
- }
- public void setAge(int age) {
- this.age = age;
- }
- public int getAge() {
- return age;
- }
- }
创建远程接口PersonService,注意远程接口需要继承Remote
- package rmi.service;
- import java.rmi.Remote;
- import java.rmi.RemoteException;
- import java.util.List;
- import rmi.model.*;
- //此为远程对象调用的接口,必须继承Remote类
- public interface PersonService extends Remote {
- public List<PersonEntity> GetList() throws RemoteException;
- }
建立PersonServiceImpl实现远程接口,注意此为远程对象实现类,需要继承UnicastRemoteObject
- package rmi.serviceImpl;
- import java.rmi.RemoteException;
- import java.rmi.server.UnicastRemoteObject;
- import java.util.LinkedList;
- import java.util.List;
- import rmi.model.PersonEntity;
- import rmi.service.*;
- //此为远程对象的实现类,须继承UnicastRemoteObject
- public class PersonServiceImpl extends UnicastRemoteObject implements PersonService {
- public PersonServiceImpl() throws RemoteException {
- super();
- // TODO Auto-generated constructor stub
- }
- @Override
- public List<PersonEntity> GetList() throws RemoteException {
- // TODO Auto-generated method stub
- System.out.println("Get Person Start!");
- List<PersonEntity> personList=new LinkedList<PersonEntity>();
- PersonEntity person1=new PersonEntity();
- person1.setAge(25);
- person1.setId(0);
- person1.setName("Leslie");
- personList.add(person1);
- PersonEntity person2=new PersonEntity();
- person2.setAge(25);
- person2.setId(1);
- person2.setName("Rose");
- personList.add(person2);
- return personList;
- }
- }
建立服务器端,在服务器端注册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启动服务。
- package rmi.remotingservice;
- import java.rmi.Naming;
- import java.rmi.registry.LocateRegistry;
- import rmi.service.*;
- import rmi.serviceImpl.*;
- public class Program{
- public static void main(String[] args) {
- // TODO Auto-generated method stub
- try {
- PersonService personService=new PersonServiceImpl();
- //注册通讯端口
- LocateRegistry.createRegistry(6600);
- //注册通讯路径
- Naming.rebind("rmi://127.0.0.1:6600/PersonService", personService);
- System.out.println("Service Start!");
- } catch (Exception e) {
- // TODO Auto-generated catch block
- e.printStackTrace();
- }
- }
- }
最后建立客户端进行测试,注意客户调用的RMI路径必须服务器配置一致
- package rmi.remotingclient;
- import java.rmi.Naming;
- import java.util.List;
- import rmi.model.PersonEntity;
- import rmi.service.*;
- public class Program {
- public static void main(String[] args){
- try{
- //调用远程对象,注意RMI路径与接口必须与服务器配置一致
- PersonService personService=(PersonService)Naming.lookup("rmi://127.0.0.1:6600/PersonService");
- List<PersonEntity> personList=personService.GetList();
- for(PersonEntity person:personList){
- System.out.println("ID:"+person.getId()+" Age:"+person.getAge()+" Name:"+person.getName());
- }
- }catch(Exception ex){
- ex.printStackTrace();
- }
- }
- }
常见错误
- 在命令提示符调用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
- 在调用javac命令时出现“javac 找不到文件 ..... ”此错误,可能是因为阁下输入的文件路径出现错误造成,注意不要把D://RMI/RemotingService/src>javac rmi/ remotingservice/ Program.java写错为D://RMI/RemotingService/src>javac rmi. remotingservice. Program.java
- 在调用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远程方法调用简单实例[转]的更多相关文章
- JAVA RMI远程方法调用简单实例(转载)
来源:http://www.cnblogs.com/leslies2/archive/2011/05/20/2051844.html RMI的概念 RMI(Remote Method Invocati ...
- Java RMI 实现一个简单的GFS(谷歌文件系统)——介绍篇
本系列主要是使用Java RMI实现一个简单的GFS(谷歌文件系统,google file system),首先整体简单介绍下该项目. [为了更好的阅读以及查看其他篇章,请查看原文:https://w ...
- Java RMI 实现一个简单的GFS(谷歌文件系统)——背景与设计篇
目录 背景 系统设计 1. 系统功能 2. Master组件 2.1 命名空间 2.2 心跳机制 2.3 故障恢复和容错机制 3. ChunkServer组件 3.1 本地存储 3.2 内存命中机制 ...
- Java RMI(远程方法调用) 实例与分析 (转)
目的: 通过本文,可以加深对Java RMI的理解,知道它的工作原理,怎么使用等. 也为了加深我自己的理解,故整理成文.不足之处,还望指出. 概念解释: RMI(RemoteMethodInvocat ...
- Java RMI(远程方法调用) 实例与分析
目的: 通过本文,可以加深对Java RMI的理解,知道它的工作原理,怎么使用等. 也为了加深我自己的理解,故整理成文.不足之处,还望指出. 概念解释: RMI(RemoteMethodInvocat ...
- java rmi远程方法调用实例
RMI的概念 RMI(Remote Method Invocation)远程方法调用是一种计算机之间利用远程对象互相调用实现双方通讯的一种通讯机制.使用这种机制,某一台计算机上的对象可以调用另外一台计 ...
- JAVA入门[18]-JdbcTemplate简单实例
一.关于JdbcTemplate JdbcTemplate是最基本的Spring JDBC模板,这个模板支持简单的JDBC数据库访问功能以及基于索引参数的查询. Spring数据访问模板:在数据库操作 ...
- Java的Socket通信简单实例
服务端 package testlxd; import java.io.BufferedReader; import java.io.IOException; import java.io.Input ...
- java中的反射简单实例
package club.reflection.entity.User; /** * 实体类 * */ public class User { public String name; private ...
随机推荐
- 混沌数学之Henon模型
相关DEMO参见:混沌数学之离散点集图形DEMO 相关代码: // http://wenku.baidu.com/view/d51372a60029bd64783e2cc0.html?re=view ...
- MyBatis两张表字段名相同产生的问题
MyBatis两张表字段名相同, 会导致bean属性都映射为第一个表的列, 解决方法: 通过设置别名的方式让其产生区别,如 <select id="queryBySekillId&qu ...
- HTML5, CSS3, ES5新的web标准和浏览器支持一览 转
本文整理了一些最重要(或者说人气比较高罢)的新标准,虽然它们多数还只是w3c的草案,离Recommendation级别还早,却已经成为新一轮浏览器大战中备受追捧的明星,开发者社区里也涌现出大量相关的d ...
- 独特的deadlock(仅update语句也能造成死锁)
最近遇到了一个看上去很奇怪,分析起来很有意思的死锁问题.这个死锁看上去难以理解.而分析过程中,又使用了很多分析SQL Server死锁的典型方法.记录下来整个分析过程还是很有意义的. 问题重现步骤: ...
- phpcms pc标签 start不生效的原因
start 和 page 参数不可同时使用,使用了page参数 会造成start 参数无效
- 为Ubuntu 安装Transmission 2.90
Transmission 是 Ubuntu 的默认 BitTorrent 客户端,近期发布了最新的 Transmission 2.90 版本,目前已经可通过 PPA 为 Ubuntu 15.10.Ub ...
- 体绘制(Volume Rendering)概述之4:光线投射算法(Ray Casting)实现流程和代码(基于CPU的实现)
转自:http://blog.csdn.net/liu_lin_xm/article/details/4850630 摘抄“GPU Programming And Cg Language Primer ...
- postgresql 内存分配
postgresql的内存分配主要由shared_buffers.temp_buffers.work_mem.maintenance_work_mem参数控制. shared_buffers又可以叫做 ...
- “/”应用程序中的server错误
前几天敲ASP.NET有关验证控件的样例的时候,出现了这个问题: 可是对于这个问题我们应该都不陌生,之前敲牛腩的时候也出现过,当时的解决方法是: 在web.config中找 <a ...
- socket.io对IE8的支持
默认下载了最新版的socket.io,版本号是1.7.2,对IE8的支持不好,反正在IE8下收发消息都不行.在网上查了很多资料,都解决不了IE8的问题,崩溃. 最后用了一个大家比较认可的版本1.0.6 ...