RMI(远程方法调用)实现简单的查单词功能
2012-06-28 10:37
906 查看
1. RMI概念
RMI(Remote Method Invocation),远程方法调用,是Java的一组拥护开发分布式应用程序的API。RMI使用Java语言接口定义了远程对象,它集合了Java序列化和Java远程方法协议(Java Remote Method Protocol)。简单地说,这样使原先的程序在同一操作系统的方法调用,变成了不同操作系统之间程序的方法调用,由于J2EE是分布式程序平台,它以RMI机制实现程序组件在不同操作系统之间的通信。比如,一个EJB可以通过RMI调用Web上另一台机器上的EJB远程方法。
2. 工作原理
在RMI中,调用远程对象的对象被称为客户机对象(Client Object)而远程对象被称为服务器对象(Server Object),同时引入了两种特殊类型对象,存根(stub)和框架(Skelton)。存根实际上是远程对象的客户端代理,它和远程对象具有相同的接口或方法列表,当客户端调用远程对象时,实际上是由相应的存根对象代理完成。在服务器端,框架对象处理“远方”的所有细节,完全可以像编写本地对象一样来编写远程对象。框架将远程对象从RMI基础结构分离开来。也就是说,客户端获得的只是代理对象,并不是服务器上的类型,只不过它实现了服务器上类型的全部功能。
3. 实例
实现简单的查单词功能,一台应用服务器以RMI的方式向客户端提供英译汉词典的服务。
创建一个简单的Java分布式远程方法调用程序可以按以下几个步骤操作:
1)定义远程接口
[java]
view plaincopyprint?
/**
* 功能说明:定义一个远程接口,必须继承Remote接口,其中需要远程调用的方法必须抛出RemoteException异常
* 作者: gangwazi
* 创建时间:2012-6-27
*/
public interface WordTranslate extends Remote {
/**
* @param str 需要被翻译的单词
* @return 英汉互译后的内容,如果词典中不包含此单词返回null
*/
public String translate(String str) throws RemoteException;
}
3)编写服务器类
[java]
view plaincopyprint?
/**
* 功能说明:创建RMI注册表,启动RMI服务,并将远程对象注册到RMI注册表中。
* 作者: gangwazi
* 创建时间:2012-6-27
*/
public class WordTranslateServer {
public static void main(String[] args) {
try {
// 创建一个远程对象
WordTranslate rTranslate = new WordTranslateImpl();
// 本地主机上的远程对象注册表Registry的实例,并指定端口为5555,这一步必不可少(Java默认端口是1099),
// 必不可缺的一步,缺少注册表创建,则无法绑定对象到远程注册表上
LocateRegistry.createRegistry(5555);
// 把远程对象注册到RMI注册服务器上,并命名为RTranslate
// 绑定的URL标准格式为:rmi://host:port/name(其中协议名可以省略)
Naming.bind("rmi://localhost:5555/RTranslate", rTranslate);
System.out.println(">>>>>INFO: 远程WorldTranslate对象绑定成功!");
} catch (RemoteException e) {
System.out.println("创建远程对象发生异常!");
e.printStackTrace();
} catch (MalformedURLException e) {
System.out.println("发生URL畸形异常!");
e.printStackTrace();
} catch (AlreadyBoundException e) {
System.out.println("发生重复绑定对象异常!");
e.printStackTrace();
}
}
}
4. 运行结果
服务器端和客户端分别运行在两台机子上
服务器端运行结果
客户端运行结果
RMI(Remote Method Invocation),远程方法调用,是Java的一组拥护开发分布式应用程序的API。RMI使用Java语言接口定义了远程对象,它集合了Java序列化和Java远程方法协议(Java Remote Method Protocol)。简单地说,这样使原先的程序在同一操作系统的方法调用,变成了不同操作系统之间程序的方法调用,由于J2EE是分布式程序平台,它以RMI机制实现程序组件在不同操作系统之间的通信。比如,一个EJB可以通过RMI调用Web上另一台机器上的EJB远程方法。
2. 工作原理
在RMI中,调用远程对象的对象被称为客户机对象(Client Object)而远程对象被称为服务器对象(Server Object),同时引入了两种特殊类型对象,存根(stub)和框架(Skelton)。存根实际上是远程对象的客户端代理,它和远程对象具有相同的接口或方法列表,当客户端调用远程对象时,实际上是由相应的存根对象代理完成。在服务器端,框架对象处理“远方”的所有细节,完全可以像编写本地对象一样来编写远程对象。框架将远程对象从RMI基础结构分离开来。也就是说,客户端获得的只是代理对象,并不是服务器上的类型,只不过它实现了服务器上类型的全部功能。
3. 实例
实现简单的查单词功能,一台应用服务器以RMI的方式向客户端提供英译汉词典的服务。
创建一个简单的Java分布式远程方法调用程序可以按以下几个步骤操作:
1)定义远程接口
[java]
view plaincopyprint?
/**
* 功能说明:定义一个远程接口,必须继承Remote接口,其中需要远程调用的方法必须抛出RemoteException异常
* 作者: gangwazi
* 创建时间:2012-6-27
*/
public interface WordTranslate extends Remote {
/**
* @param str 需要被翻译的单词
* @return 英汉互译后的内容,如果词典中不包含此单词返回null
*/
public String translate(String str) throws RemoteException;
}
[java] view plaincopyprint? /** * 功能说明:远程接口的实现 * 作者: gangwazi * 创建时间:2012-6-27 */ public class WordTranslateImpl extends UnicastRemoteObject implements WordTranslate { private static final long serialVersionUID = 1L; public Map<String, String> wordMap = new HashMap<String, String>(); // 因为UnicastRemoteObject的构造方法抛出了RemoteException异常,因此这里默认的构造方法必须写,必须声明抛出RemoteException异常 public WordTranslateImpl() throws RemoteException { super(); wordMap.put("China", "n. 中国"); wordMap.put("Japan", "n. 日本"); wordMap.put("German", "德国"); wordMap.put("list", "n. 列表; v. 列出"); wordMap.put("egg", "n. 鸡蛋"); wordMap.put("map", "n. 地图"); wordMap.put("translate", "v. 翻译"); wordMap.put("banana", "n. 香蕉"); wordMap.put("apple", "n. 苹果"); wordMap.put("orange", "n. 橘子"); wordMap.put("milk", "n. 牛奶"); wordMap.put("water", "n. 水"); wordMap.put("drink", "v. 喝,饮"); } @Override public String translate(String str) throws RemoteException { if (wordMap.containsKey(str)) { return wordMap.get(str); } else { return null; } } } /** * 功能说明:远程接口的实现 * 作者: gangwazi * 创建时间:2012-6-27 */ public class WordTranslateImpl extends UnicastRemoteObject implements WordTranslate { private static final long serialVersionUID = 1L; public Map<String, String> wordMap = new HashMap<String, String>(); // 因为UnicastRemoteObject的构造方法抛出了RemoteException异常,因此这里默认的构造方法必须写,必须声明抛出RemoteException异常 public WordTranslateImpl() throws RemoteException { super(); wordMap.put("China", "n. 中国"); wordMap.put("Japan", "n. 日本"); wordMap.put("German", "德国"); wordMap.put("list", "n. 列表; v. 列出"); wordMap.put("egg", "n. 鸡蛋"); wordMap.put("map", "n. 地图"); wordMap.put("translate", "v. 翻译"); wordMap.put("banana", "n. 香蕉"); wordMap.put("apple", "n. 苹果"); wordMap.put("orange", "n. 橘子"); wordMap.put("milk", "n. 牛奶"); wordMap.put("water", "n. 水"); wordMap.put("drink", "v. 喝,饮"); } @Override public String translate(String str) throws RemoteException { if (wordMap.containsKey(str)) { return wordMap.get(str); } else { return null; } } }由于只是简单的示例,故词典使用map来存储,当然也可以构造专门的词典文件或者从数据库中查询。
3)编写服务器类
[java]
view plaincopyprint?
/**
* 功能说明:创建RMI注册表,启动RMI服务,并将远程对象注册到RMI注册表中。
* 作者: gangwazi
* 创建时间:2012-6-27
*/
public class WordTranslateServer {
public static void main(String[] args) {
try {
// 创建一个远程对象
WordTranslate rTranslate = new WordTranslateImpl();
// 本地主机上的远程对象注册表Registry的实例,并指定端口为5555,这一步必不可少(Java默认端口是1099),
// 必不可缺的一步,缺少注册表创建,则无法绑定对象到远程注册表上
LocateRegistry.createRegistry(5555);
// 把远程对象注册到RMI注册服务器上,并命名为RTranslate
// 绑定的URL标准格式为:rmi://host:port/name(其中协议名可以省略)
Naming.bind("rmi://localhost:5555/RTranslate", rTranslate);
System.out.println(">>>>>INFO: 远程WorldTranslate对象绑定成功!");
} catch (RemoteException e) {
System.out.println("创建远程对象发生异常!");
e.printStackTrace();
} catch (MalformedURLException e) {
System.out.println("发生URL畸形异常!");
e.printStackTrace();
} catch (AlreadyBoundException e) {
System.out.println("发生重复绑定对象异常!");
e.printStackTrace();
}
}
}
[java] view plaincopyprint? /** * 功能说明:客户端测试,在客户端调用远程对象上的远程方法,并返回结果。 * 作者: gangwazi * 创建时间:2012-6-27 */ public class WorldTranslateClient { public static void main(String[] args) { try { // 在RMI服务注册表中查找名称为RTranslate的对象,并调用其上的方法 WordTranslate rTranslate = (WordTranslate) Naming.lookup("rmi://202.117.10.64:5555/RTranslate"); System.out.print("查询单词 China----------->"); System.out.println(rTranslate.translate("China")); System.out.print("查询单词 list----------->"); System.out.println(rTranslate.translate("list")); System.out.print("查询单词 present----------->"); System.out.println(rTranslate.translate("present")); System.out.print("查询单词 banana----------->"); System.out.println(rTranslate.translate("banana")); System.out.print("查询单词 util----------->"); System.out.println(rTranslate.translate("util")); System.out.print("查询单词 drink----------->"); System.out.println(rTranslate.translate("drink")); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NotBoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } } /** * 功能说明:客户端测试,在客户端调用远程对象上的远程方法,并返回结果。 * 作者: gangwazi * 创建时间:2012-6-27 */ public class WorldTranslateClient { public static void main(String[] args) { try { // 在RMI服务注册表中查找名称为RTranslate的对象,并调用其上的方法 WordTranslate rTranslate = (WordTranslate) Naming.lookup("rmi://202.117.10.64:5555/RTranslate"); System.out.print("查询单词 China----------->"); System.out.println(rTranslate.translate("China")); System.out.print("查询单词 list----------->"); System.out.println(rTranslate.translate("list")); System.out.print("查询单词 present----------->"); System.out.println(rTranslate.translate("present")); System.out.print("查询单词 banana----------->"); System.out.println(rTranslate.translate("banana")); System.out.print("查询单词 util----------->"); System.out.println(rTranslate.translate("util")); System.out.print("查询单词 drink----------->"); System.out.println(rTranslate.translate("drink")); } catch (MalformedURLException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (RemoteException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (NotBoundException e) { // TODO Auto-generated catch block e.printStackTrace(); } } }
4. 运行结果
服务器端和客户端分别运行在两台机子上
服务器端运行结果
客户端运行结果
相关文章推荐
- RMI(远程方法调用)实现简单的查单词功能
- Java的RMI远程方法调用实现和应用
- JAVA 自带的RMI远程调用功能的实现和原理
- RMI(远程方法调用)简单示例
- .net下的面向工控领域的远程方法调用(RMI)中间件,通信层实现
- Python中实现远程调用(RPC、RMI)简单例子
- Java动态代理实现模拟RMI远程方法调用
- 根据RemObject的远程方法调用原理实现的简单远程方法调用
- rmi经典实例---远程调用简单实现方式
- RMI远程方法调用简单实例
- 使用RMI实现远程方法调用
- 远程方法调用简单实现
- windows下简单的调用Setforegroundwindow并不能将窗口置最前,我找到三种方法可以实现该功能。
- 基于zookeeper的远程方法调用(RMI)的实现
- 使用AIDL实现IPC通信之——简单调用远程服务的方法
- .net下的面向工控领域的远程方法调用(RMI)中间件,客户端协议栈应答端实现
- 简单的RMI远程调用框架架实现
- spring整合RMI实现Java远程方法调用
- 根据RemObject的远程方法调用原理实现的简单远程方法调用
- RMI(远程方法调用)实现远程操作电脑的步骤