Java Remote Method Invocation(Java RMI) 是一个 Java API, 执行远程方法的调用,相当于 Remote Procedure Calls(RPC)。Java RMI 支持直接传输序列化的 Java 类,以及分布式的垃圾回收。

案例概况

实现一个简单的 Java RMI 可通过以下四步骤:

1. 启动 rmiregistry

2. 定义服务接口,实现服务接口,通过 rmic 工具创建存根文件( stub )

3. 实现服务端功能,并启动

4. 实现客户端功能,并调用服务端服务

具体实现

1. 启动 rmiregistry

grs:~ grs$ rmiregistry 

2. 定义服务接口,实现服务接口,通过 rmic 工具创建存根文件( stub )

定义服务接口:

package service;

import java.rmi.Remote;
import java.rmi.RemoteException; public interface GreetService extends Remote { String sayHello(String name) throws RemoteException; }

实现服务接口:

package service;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject; public class GreetServiceImpl extends UnicastRemoteObject implements GreetService { static final long serialVersionUID = 1L; public GreetServiceImpl() throws RemoteException {
super();
} @Override
public String sayHello(String name) throws RemoteException {
return "Hello - " + name;
}
}

根据编译后的 GreetServiceImpl,使用 rmic 生成存根文件

grs:bin grs$ rmic service.GreetServiceImpl

执行后,目录如下

grs:bin grs$ tree
.
└── service
├── GreetService.class
├── GreetServiceImpl.class
└── GreetServiceImpl_Stub.class directories, files
grs:bin grs$

3. 实现服务端功能,并启动

package server;

import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry; import service.GreetServiceImpl; public class Server { public static void main(String[] args){ try {
LocateRegistry.createRegistry(1098);
Naming.bind("rmi://127.0.0.1:1098/GreetService", new GreetServiceImpl()); } catch (RemoteException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (AlreadyBoundException e) {
e.printStackTrace();
}
}
}

编译后,服务端文件目录结构如下:

grs:bin grs$ tree
.
├── server
│   └── Server.class
└── service
├── GreetService.class
└── GreetServiceImpl.class 2 directories, 3 files
grs:bin grs$

启动服务端

grs:bin grs$ java -server server.Server

4. 实现客户端功能,并调用服务端服务

package client;

import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RemoteException; import service.GreetService; public class Client { public static void main(String[] args){ try {
String name = "rmi://127.0.0.1:1098/GreetService";
GreetService greetService = (GreetService) Naming.lookup(name); System.out.println(greetService.sayHello(" Thhhhhhh ")); } catch (MalformedURLException e) {
e.printStackTrace();
} catch (RemoteException e) {
e.printStackTrace();
} catch (NotBoundException e) {
e.printStackTrace();
}
}
}

编译后文件目录结构如下

grs:bin grs$ tree
.
├── client
│   └── Client.class
└── service
├── GreetService.class
└── GreetServiceImpl_Stub.class directories, files
grs:bin grs$

客户端调用远程端方法

grs:bin grs$ java -client client.Client
Hello - Thhhhhhh
grs:bin grs$

参考资料:

RMI 入门教程, DRY, 博客园

Introduction to Java RMI

[chapter 18] Distributed Computing : remote deployment with RMI, Head First Java

RMI, The Java Tutorials, Oracle

Java Remote Method Invocation, wikipedia

Java RMI 入门案例的更多相关文章

  1. java rmi 入门实例

    java rmi 入门实例 (2009-06-16 16:07:55) 转载▼ 标签: java rmi 杂谈 分类: java-基础    java rmi即java远程接口调用,实现了2台虚拟机之 ...

  2. java RMI入门指南

    感觉这篇文章不错,直接转了 RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体如今它强大的开发分布式网络应用的能力上,是纯J ...

  3. Java RMI 入门指南

    开通博客也有好些天了,一直没有时间静下心来写博文,今天我就把两年前整理的一篇关于JAVA RMI入门级文章贴出来,供有这方面需要的同学们参考学习. RMI 相关知识 RMI全称是Remote Meth ...

  4. Java : Netty 入门案例

    接收端代码: public class IOServer { public static void main(String[] args) throws IOException, Interrupte ...

  5. Java RMI之HelloWorld经典入门案例

    Java RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法.可以用此方 ...

  6. Quartz应用实践入门案例二(基于java工程)

    在web应用程序中添加定时任务,Quartz的简单介绍可以参看博文<Quartz应用实践入门案例一(基于Web应用)> .其实一旦学会了如何应用开源框架就应该很容易将这中框架应用与自己的任 ...

  7. _00017 Kafka的体系结构介绍以及Kafka入门案例(0基础案例+Java API的使用)

    博文作者:妳那伊抹微笑 itdog8 地址链接 : http://www.itdog8.com(个人链接) 博客地址:http://blog.csdn.net/u012185296 博文标题:_000 ...

  8. 自己写了个Java RMI(远程方法调用)的实现案例

    自己简单写了个Java RMI(远程方法调用)的实现案例. 为了更好理解RMI(远程方法调用).序列化的意义等等,花费三天多的时间肝了一个Java RMI的实现案例. !!!高能预警!!! 代码量有点 ...

  9. Java开发学习(二)----IOC、DI入门案例

    一.IOC入门案例 1.1 思路分析 (1)Spring是使用容器来管理bean对象的,那么管什么? 主要管理项目中所使用到的类对象,比如(Service和Dao) (2)如何将被管理的对象告知IOC ...

随机推荐

  1. Eclipse快捷键 10个最有用的快捷键(转)

    Eclipse中10个最有用的快捷键组合  一个Eclipse骨灰级开发者总结了他认为最有用但又不太为人所知的快捷键组合.通过这些组合可以更加容易的浏览源代码,使得整体的开发效率和质量得到提升.    ...

  2. 0_Linux_虚拟机安装

    虚拟机的安装0Snapshot和clone 系统分区(由硬盘的性能所限制的) 1分区类型: 主分区:最多有4个 扩展分区:最多只能有1个:主分区加扩展分区最多有4个:不能写入数据,只能包含逻辑分区,不 ...

  3. JS 获取元素的属性值,非内联样式

    //获取样式表的属性值,IE8及以下不兼容 ,方法 window.getComputedStyle(dom对象,"伪类").style属性;   //IE8及以下获取样式表的属性值 ...

  4. Android Service生命周期及用法

    Service概念及用途:Android中的服务,它与Activity不同,它是不能与用户交互的,不能自己启动的,运行在后台的程序,如果我们退出应用时,Service进程并没有结束,它仍然在后台运行, ...

  5. The following module was built either with optimizations enabled or witherout debug information

    出现这个问题的原因是这个程式有做版控,服务器上的版本比本机版本小 解决方式为:删除服务器上的版控或者本机版本改成与服务器一致即可

  6. 通同select便签实现简单的二级联动

    <!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...

  7. 05_Smart-image通过SoftReference提高性能

    文章导读: 文件介绍了常见的图片下载开源插件smart-image, 由于移动设备硬件受限,因此Android的相关app都要考虑到性能的关系, 所以很多的第三方插件都使用到了缓存cache技术,本人 ...

  8. java对mysql数据库进行单表筛选备份、还原操作

    最近在做的一个项目需要对mysql数据库中的单个表格进行备份 其中,一部分表格需要进行筛选备份(例如对最近插入的1000条记录进行备份) 思路:java调用系统命令完成备份操作 假设现在有数据库tes ...

  9. DontDestroyOnLoad

    本文由博主(YinaPan)原创,转载请注明出处:http://www.cnblogs.com/YinaPan/p/Unity_DontDestroyOnLoad.html  public stati ...

  10. ES5严格模式

    http://www.cnblogs.com/snandy/p/3428171.html 介绍了由ECMA262规范定义的Javascript标准,旨在改善错误检查功能并且标识不会延续到未来js版本的 ...