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. 实现客户端功能,并调用服务端服务
具体实现
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$
参考资料:
[chapter 18] Distributed Computing : remote deployment with RMI, Head First Java
RMI, The Java Tutorials, Oracle
Java Remote Method Invocation, wikipedia
Java RMI 入门案例的更多相关文章
- java rmi 入门实例
java rmi 入门实例 (2009-06-16 16:07:55) 转载▼ 标签: java rmi 杂谈 分类: java-基础 java rmi即java远程接口调用,实现了2台虚拟机之 ...
- java RMI入门指南
感觉这篇文章不错,直接转了 RMI全称是Remote Method Invocation-远程方法调用,Java RMI在JDK1.1中实现的,其威力就体如今它强大的开发分布式网络应用的能力上,是纯J ...
- Java RMI 入门指南
开通博客也有好些天了,一直没有时间静下心来写博文,今天我就把两年前整理的一篇关于JAVA RMI入门级文章贴出来,供有这方面需要的同学们参考学习. RMI 相关知识 RMI全称是Remote Meth ...
- Java : Netty 入门案例
接收端代码: public class IOServer { public static void main(String[] args) throws IOException, Interrupte ...
- Java RMI之HelloWorld经典入门案例
Java RMI 指的是远程方法调用 (Remote Method Invocation).它是一种机制,能够让在某个 Java 虚拟机上的对象调用另一个 Java 虚拟机中的对象上的方法.可以用此方 ...
- Quartz应用实践入门案例二(基于java工程)
在web应用程序中添加定时任务,Quartz的简单介绍可以参看博文<Quartz应用实践入门案例一(基于Web应用)> .其实一旦学会了如何应用开源框架就应该很容易将这中框架应用与自己的任 ...
- _00017 Kafka的体系结构介绍以及Kafka入门案例(0基础案例+Java API的使用)
博文作者:妳那伊抹微笑 itdog8 地址链接 : http://www.itdog8.com(个人链接) 博客地址:http://blog.csdn.net/u012185296 博文标题:_000 ...
- 自己写了个Java RMI(远程方法调用)的实现案例
自己简单写了个Java RMI(远程方法调用)的实现案例. 为了更好理解RMI(远程方法调用).序列化的意义等等,花费三天多的时间肝了一个Java RMI的实现案例. !!!高能预警!!! 代码量有点 ...
- Java开发学习(二)----IOC、DI入门案例
一.IOC入门案例 1.1 思路分析 (1)Spring是使用容器来管理bean对象的,那么管什么? 主要管理项目中所使用到的类对象,比如(Service和Dao) (2)如何将被管理的对象告知IOC ...
随机推荐
- U口破解指令介绍.
- TCO 2015 Round 1B DIV1 500 概率题
[题意]现在有一些线索,每个线索被发现的概率p[i],如果线索i被知道,那么其他线索也可能会被知道,用vector<string> c给出,c[i][j]='Y'表示知道i这个线索,j这个 ...
- DWZ框架学习一
测试DWZ框架弹出框设置成模态 刚刚上手DWZ框架,感觉灰常好用,对于我这种特别懒的人来说,真的是拖拽编程 看了下官方的视频讲解,自己试着做了一个小测试,里面的组件什么的都不用写,直接拿来用 这里附上 ...
- Gradle命令详解与导入第三方包
Android Studio + Gradle的组合用起来非常方便,很多第三方开源项目也早都迁移到了Studio,为此今天就来介绍下查看.编译并导入第三方开源项目的方法. Sublime + Term ...
- Web中常用字体介绍(转)
1.在Web编码中,CSS默认应用的Web字体是有限的,虽然在新版本的CSS3,我们可以通过新增的@font-face属性来引入特殊的浏览器加载字体. 浏览器中展示网页文字内容时,文字字体都会按照设计 ...
- oracle中使用minus进行数据排除(类似SqlServer except函数)
minus这个集合操作符号的作用是从一个结果集合中减掉另一个结果集中数据,也就是说从一个结果集中去除两个结果集中的共有部分. 下面是一些例子: 这个例子使用minus从第一个结果集中将两个结果集的公有 ...
- Android VideoView
这两天公司要让做一个播放视频的小Demo,于是网上学习了下VideoView的使用方法. 先看布局文件,很简单 就是一个VideoView和两个ImageView <RelativeLayout ...
- linux command cp.
Examples cp file1.txt newdir Copies the file1.txt in the current directory to the newdir subdirector ...
- JavaScript--函数-01
函数的本质: function:创建一个函数对象的意思 什么是函数对象: 专门封装一个函数定义的存储空间 其实,函数是一个引用类型的对象 函数名,其实是一个引用函数对象的变量 函数只有在调用时才执行, ...
- 2.常用快捷键.md
[toc] 1.mian函数补全 在IntelJ中和Eclipse中稍有不同,在Eclipse中,输入main再按Alt+/即可自动补全main函数,但是在IntellJ中则是输入psvm,选中即可 ...