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接口


1 package com.cnblogs.javalouvre.service;
2
3 import java.rmi.RemoteException;
4
5 public interface GreetService extends java.rmi.Remote {
6
7 String sayHello(String name) throws RemoteException;
8
9 }

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


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

3、生成Stub和Skeleton;

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


[[email protected] ~]#javac -source 1.6 -target 1.6 -d . *.java
[[email protected] ~]#rmic com.cnblogs.javalouvre.service.GreetServiceImpl

4、注册服务

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


[[email protected] ~]#rmiregistry

5、启动服务


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

编译、启动服务


[[email protected] ~]#javac -source 1.6 -target 1.6 -d . Server.java
[[email protected] ~]#java -server com.cnblogs.javalouvre.server.Server

6、客户端调用


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

编译,执行


[[email protected] ~]#javac -source 1.6 -target 1.6 -d . Client.java
[[email protected] ~]#java -client com.cnblogs.javalouvre.client.Client
[[email protected] ~]#Hello Jobs

时间: 2024-10-28 23:17:32

RMI入门教程的相关文章

Java RMI 入门案例

Java Remote Method Invocation(Java RMI) 是一个 Java API, 执行远程方法的调用,相当于 Remote Procedure Calls(RPC).Java RMI 支持直接传输序列化的 Java 类,以及分布式的垃圾回收. 案例概况 实现一个简单的 Java RMI 可通过以下四步骤: 1. 启动 rmiregistry 2. 定义服务接口,实现服务接口,通过 rmic 工具创建存根文件( stub ) 3. 实现服务端功能,并启动 4. 实现客户端

目前见到的最傻瓜全面的STRUTS入门教程^_^

目前见到的最傻瓜全面的STRUTS入门教程^_^ 一  Jakarta Struts学习之新手上路 Web 应用开发早期曾经是那么的“简单”,那个时候还只是纯HTML页面和浏览器特效而已.由于还涉及不到动态数据操作和商业应用,也就省去了很多麻烦.但是这 样的“简单”只是过眼云烟,如今我们不得不为复杂的基于Web的商业应用开发采用诸多技术. 本文将介绍如何利用Struts进行应用开发的前台整合的开发过程.Struts是一个为开发基于模型(Model)-视图(View)-控制器 (Controlle

Docker(一):Docker入门教程

如今Docker的使用已经非常普遍,特别在一线互联网公司.使用Docker技术可以帮助企业快速水平扩展服务,从而到达弹性部署业务的能力.在云服务概念兴起之后,Docker的使用场景和范围进一步发展,如今在微服务架构越来越流行的情况下,微服务+Docker的完美组合,更加方便微服务架构运维部署落地. 本文详细解释介绍Docker入门相关内容,后期重点关注Docker在微服务体系中的使用.在了解Docker之前我们先考虑几个问题:1.Docker是什么?2.为什么要使用Docker,它有什么优势?带

<zz>bower入门教程

from http://www.cnblogs.com/xiaokai0203/p/5891927.html bower入门教程 什么是bower Bower是一个客户端技术的软件包管理器,它可用于搜索.安装和卸载如JavaScript.HTML.CSS之类的网络资源.其他一些建立在Bower基础之上的开发工具,如YeoMan和Grunt,这个会在以后的文章中介绍. 准备工作 安装node环境:node.js 安装Git,bower从远程git仓库获取代码包:git简易指南 安装bower 使用

【转载】GBDT(MART) 迭代决策树入门教程 | 简介

      转载地址:http://blog.csdn.net/w28971023/article/details/8240756        GBDT(Gradient Boosting Decision Tree) 又叫 MART(Multiple Additive Regression Tree),是一种迭代的决策树算法,该算法由多棵决策树组成,所有树的结论累加起来做最终答案.它在被提出之初就和SVM一起被认为是泛化能力(generalization)较强的算法.近些年更因为被用于搜索排

SEO学习步骤总结入门教程

在这里,简单的把SEO的学习步骤说了一下,今天我们一起来把SEO学习步骤每一步的主要内容拿出来重点强调一下并做个总结.  定位好网站内容以后把你所想做排名的关键词定位好,关键词里包括了主关键词和长尾关键词.这里重点强调了不可以忽略长尾关键词的作用.  对于一个好的网站结构可以让搜索引擎蜘蛛顺利的抓取我网站的内容,进而达到被收录的目的.比较有利于蜘蛛抓取的网站结构,一般来说,收录数量相对来说会比较多.,只有让搜索引擎收录你网站页面那搜索引擎才会释放出来,这样网站关键词才可能有排名.  这里重点要注

Android基础入门教程——10.12 传感器专题(3)——加速度-陀螺仪传感器

Android基础入门教程--10.12 传感器专题(3)--加速度/陀螺仪传感器 标签(空格分隔): Android基础入门教程 本节引言: 本节继续来扣Android中的传感器,本节带来的是加速度传感器(Accelerometer sensor)以及 陀螺仪传感器(Gyroscope sensor),和上一节的方向传感器一样有着x,y,z 三个轴, 还是要说一点:x,y轴的坐标要和绘图那里的x,y轴区分开来!传感器的是以左下角 为原点的!x向右,y向上!好的,带着我们的套路来学本节的传感器吧

Android基础入门教程——8.1.3 Android中的13种Drawable小结 Part 3

Android基础入门教程--8.1.3 Android中的13种Drawable小结 Part 3 标签(空格分隔): Android基础入门教程 本节引言: 本节我们来把剩下的四种Drawable也学完,他们分别是: LayerDrawable,TransitionDrawable,LevelListDrawable和StateListDrawable, 依旧贴下13种Drawable的导图: 1.LayerDrawable 层图形对象,包含一个Drawable数组,然后按照数组对应的顺序来

Android基础入门教程——8.1.2 Android中的13种Drawable小结 Part 2

Android基础入门教程--8.1.2 Android中的13种Drawable小结 Part 2 标签(空格分隔): Android基础入门教程 本节引言: 本节我们继续来学习Android中的Drawable资源,上一节我们学习了: ColorDrawable:NinePatchDrawable: ShapeDrawable:GradientDrawable!这四个Drawable~ 而本节我们继续来学习接下来的五个Drawable,他们分别是: BitmapDrawable:Insert