`
maimode
  • 浏览: 412325 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

RMI入门学习

阅读更多

RMI是什么?

 

RMI为分布式系统交互提供了一种解决方案。

 

RMI底层通过网络实现运行在不同环境中的java系统间相互调用方法,就如同调用本地方法一样。

 

基于RMI的开发步骤:

 

1.编写RMI服务接口,须继承java.rmi.Remote类,而且所有方法都需要声明抛出java.rmi.RemoteException异常,所有参数均须实现序列化。

 

2.编写接口实现类,须继承UnicastRemoteObject类,实现上步骤中定义的接口,由于是序列化的类因此需要定义serialVersionUID字段。

 

3.注册RMI服务,即将服务对象绑定到指定端口上。

 

4.编写客户端远程调用的代码。

 

 

一个简单示例:

 

在服务端,即提供远程方法的一端

 

1 定义RMI服务接口

 

package test.rmi;

import java.rmi.Remote;
import java.rmi.RemoteException;

/**
 * RMI服务
 * 2012-7-19 下午05:58:06
 *
 */
public interface RmiTestService extends Remote {

	public String getMessage(String p) throws RemoteException;
}

 

这些接口一般达成jar包发给客户端,供客户端编译时使用。

 

 

2 实现接口

package test.rmi;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;

/**
 * 服务实现
 * 2012-7-19 下午06:01:04
 */
public class RmiTestServiceImpl extends UnicastRemoteObject implements
		RmiTestService {

	private static final long serialVersionUID = 1L;

	/**
	 * @throws RemoteException
	 */
	protected RmiTestServiceImpl() throws RemoteException {
		super();
	}

	/* (non-Javadoc)
	 * @see test.rmi.RmiTestService#getMessage(java.lang.String)
	 */
	@Override
	public String getMessage(String p) throws RemoteException {
		// TODO Auto-generated method stub
		System.out.println("收到请求参数:" + p);
		return "Rmi:" + p;
	}
}
 

 

3 编写RMI服务注册代码

 

package test.rmi;

import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;

/**
 * RMI服务器
 * 2012-7-19 下午06:04:39
 */
public class RmiServer {
	private int port = 9123;
	private String ip = "127.0.0.1";
	
	/**
	 * 开启RMI服务
	 */
	public void start(){
		try {  
            LocateRegistry.createRegistry(port);  
            // 创建一个远程对象  
            RmiTestService comm = new RmiTestServiceImpl();  
            Naming.bind("//" + ip + ":" + port + "/comm", comm);  
        } catch (RemoteException e) {  
            System.out.println("创建远程对象发生异常!" + e.toString());  
            e.printStackTrace();  
        } catch (AlreadyBoundException e) {  
            System.out.println("发生重复绑定对象异常!" + e.toString());  
            e.printStackTrace();  
        } catch (MalformedURLException e) {  
            System.out.println("发生URL畸形异常!" + e.toString());  
            e.printStackTrace();  
        }  
	}
	
	public static void main(String []argus){
		RmiServer server = new RmiServer();
		System.out.println("启动RMI服务...");
		server.start();
		System.out.println("RMI服务已经启动");
	}
}

 

在客户端,即调用远程方法的一端 

 

 

首先应添加服务端提供的接口jar包,以便于本地编译。

 

4 客户端远程方法调用

 

package test.rmi.client;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;

import test.rmi.RmiTestService;

/**
 * 客户端调用RMI服务
 * 2012-7-19 下午06:14:11
 */
public class RmiTestClient {
	private int port = 9123;
	private String ip = "192.168.1.19";
	
	private RmiTestService service;
	
	
	/**
	 * 获取远程服务实例
	 * @return
	 */
	public RmiTestService getService(){
		if (this.service == null) {
			try {
				// 在RMI服务注册表中查找名称为RmiMonitorService的对象,并调用其上的方法
				service = (RmiTestService) Naming.lookup("rmi://" + ip + ":"
						+ port + "/comm");

			} catch (NotBoundException e) {
				e.printStackTrace();
			} catch (MalformedURLException e) {
				e.printStackTrace();
			} catch (RemoteException e) {
				e.printStackTrace();
			}
		}
        return service;
	}
	
	/**
	 * 本地通过调用远程对象的方法实现远程方法调用
	 * @param p
	 * @return
	 */
	public String getMessage(String p){
		String rt = null;
		try {
			rt = this.getService().getMessage(p);
		} catch (RemoteException e) {
			e.printStackTrace();
		}
		return rt;
	}

	/**
	 * TODO(简要描述方法的作用)
	 * @param args
	 */
	public static void main(String[] args) {
		// TODO Auto-generated method stub
		RmiTestClient client = new RmiTestClient();
		System.out.println("调用远程方法...");
		String rt = client.getMessage("hello");
		System.out.println("rmi返回:" + rt);
	}
}
 

 

测试运行:

首先运行RmiServer.main方法,启动RMI服务,然后运行RmiTestClient.main方法调用rmi服务。

 

上面是一个简单的RMI应用实例,其中没有添加安全措施,如果服务对外网开放则需要添加安全措施,这部分内容,慢慢研究,后面再补充。

 

 

 

 

0
3
分享到:
评论

相关推荐

    RMI 入门学习资料

    这是本人刚学习RMI时整理出来的一份RMI入门级的资料,其中有几个简单的RMI应用的例子,公布出来供初学RMI的朋友参考学习,提高初学者对RMI学习的速度...

    rmi入门学习,实用的小例子

    描述java rmi的实用方式,有实用简单的入门介绍,很容易理解!!!

    rmi基础知识学习

    rmi不可多得的学习材料!

    rmi学习笔记(1)

    rmi基础知识学习笔记,从最简单的例子讲述rmi的用途

    JavaBean和RMI 学习

    JavaBean保留了其他软件组件的技术精华,并增加了被其他软件组件技术忽略的技术特性,使得它成为完整的软件组件解决方案的基础,并在可移植的Java平台上方便地用于网络世界中 Java RMI(Remote Method Invocation)-...

    RMI+EHCACHE Demo

    RMI+EHCACHE可以做基础学习理解

    JavaRMI快速入门

    这个是学习Java的开始阶段必须要了解和学习的重要内容,它能带领大家快速的进入Java的开发过程中来,给大家解决迷津....

    rmi实例详解

    RMI的实例详解,可以学习到RMI的一些简单的操作,是很入门的哪种文档

    RMI.rar_Java RMI

    学习java RMI 很好的例子,入门程序

    rmi.rar_rmi实现方式_rmi简单的实现

    一个简单的RMI实现,可实现方法的远程调用,是学习RMI很好的入门资料。

    RMI 的全套使用

    不多说,除了RMI的学习外,gui对新手入门也是个不错的学习 /* *此类适合在本地注册的RMI服务器,避免了使用了多个DOS的写法,只需要简单的给使用 *本类提供的方法即可。 */ package common.rmiserver; import ...

    spring RMI 实例

    spring 对 RMI 的封装 一个很精简的例子,用于springRMI的入门学习很好 调试通过咯

    Hessian学习入门实例

    这是一个Hessian入门学习的实例,程序包是一个web工程,使用intellij idea + Maven开发,其中通过两个方式展示了使用Hessian实现RMI的原理,一个是访问jsp页面,一个是在代码中手工创建client。对于Hessian Servlet...

    java基础教程PPT

    这是提供给入门学习java的计算机语言爱好者的PPT版java基础教程,涉及对象,容器,多线程,数据库处理,网络编程,RMI和JSP等等技术章节.....适合初学者或有其它编程语言基础者学习使用

    j2ee基础知识

    J2EE简介及学习方法 J2EE基础技术  XML、RMI、JNDI 、JMS

    JAVA学习的参考学习流程

    教会如何从零开始学习java 表(1) 面授课程技术 NO. 类别 01 操作系统 Windows --> Linux 02 中间件 Tomcat --> JBoss 03 数据库 MySQL --> Oracle 04 JAVA SE 环境搭建 --> 基础程序 --> 面向对象 --> 应用开发 ...

    JAVA学习计划和方法

    JAVA学习计划和方法内容包括:AVA语言基础知识。包括异常、IO流、多线程、集合类、数据库。 JAVA网络编程。包括Socket、RMI、HTML、XML、JSP、JavaBean、Servlet......

    基于Spring、RMI框架、MySQL、元数据模型实战开发企业通用人力资源系统(项目文档+数据库+完整源码)-适合毕设论文

    1、基础框架 2、人事信息:人事项目管理,离职管理,奖惩管理,年假管理,员工异动,员工转正 3、web建模,提供表单库。 4、考勤管理:考勤记录的导入计算。配置考勤规则。 5、排班 完整数据库文档,系统,源代码,...

    【白雪红叶】JAVA学习技术栈梳理思维导图.xmind

    RMI 异步 MQ Cron 数据层架构设计 缓存优化 DAO&ORM; 双主架构 主从同步 读写分离 性能优化架构能力 代码级别 关联代码优化 cache对其 分支预测 copy on write 内联优化 系统优化 cache 延迟计算...

Global site tag (gtag.js) - Google Analytics