`
xsuo
  • 浏览: 123416 次
  • 性别: Icon_minigender_1
  • 来自: 武汉
社区版块
存档分类
最新评论

JDK5新版RMI编程指南

阅读更多
JDK5新版RMI编程指南
前言
我前一段时间需要为我的一个Java程序提供远程访问接口,供其他Java程序使用。Java程序可以使用很多种远程访问技术实现这一需求。由于我的远程客户端是java程序,因此,我决定使用RMI这种远程访问技术。RMI是java平台上最快的远程访问技术。
Spring框架为包括RMI在内的各种远程访问技术提供了很好的工具类,能够使我们方便的公布RMI接口和访问RMI远程对象。
但是,我的那个Java程序并没有使用Spring框架。
因此,我研究了怎样在一般的java程序中使用RMI技术。
我寻找了一些RMI资料。根据那些RMI资料,构建一个RMI服务器需要写大量的代码。这太离谱了!一个小小的需求,竟然需要这么大的精力。
后来,我看了javadoc,才发现网上的那些RMI资料都已经过时了。JDK5中,RMI技术已经得到了重大更新。现在使用JDK提供的RMI类,可以相当简单的发布RMI服务!
正文
RMI简介
RMI(Remote Method Invocation),远程方法调用,是一种远程调用java方法的技术。是最早开发出来的java远程访问技术,也是EJB等远程访问技术的基础。
过 去,使用RMI技术共有6个步骤要走: (1)定义和实现远端接口中的参数 (2) 定义和实现远端接口 (3) 编写服务端代码 (4)编写客户端代码 (5)生成stub和skeltion ,并将stub打包到客户端jar中,将skeltion打包到服务端jar中 (6)启动rmiregistry , 并将服务注册到rmiregistry中,然后运行代码。
这还需要执行一些命令行程序,非常繁杂!这与RMI这样一种简单的技术非常不相称!
好在JDK5中,RMI得到了重大更新。RMI已经成为一种真正轻量级的简单技术!
JDK5中,使用了动态代理技术,实现了动态生成stub和skeltion类,从而省却了相当多的繁琐工作。RMI的创建和发布已经变得非常简单!
建立RMI服务器和注册表
1,Registry接口
java.rmi.registry
接口 Registry
所有超级接口:

public interface Registry
extends Remote
Registry 是简单远程对象注册表的一个远程接口,它提供存储和获取绑定了任意字符串名称的远程对象引用的方法。bindunbindrebind 方法用于改变注册表中的名称绑定,lookuplist 方法用于查询当前的名称绑定。
Registry接口,是RMI对象的注册表,客户端通过这个注册表查询和得到RMI对象。
2,LocateRegistry类
java.rmi.registry
类 LocateRegistry
java.lang.Object
                             java.rmi.registry.LocateRegistry

public final class LocateRegistry
extends Object
LocateRegistry 用于获得对特定主机(包括本地主机)上引导远程对象注册表的引用,或用于创建一个接受对特定端口调用的远程对象注册表。
staticRegistry
createRegistry(intport)
创建并导出接受指定 port 请求的本地主机上的 Registry 实例。
LocateRegistry类的createRegistry()方法,创建并得到对远程RMI对象注册表的引用。
现在,我们就成功创建了一个RMI服务器和对象注册表。
然后,通过调用Registry接口的方法:
void
rebind(Stringname, Remoteobj)
用提供的远程引用替换此注册表中指定的 name 绑定。
我们能够把RMI对象发布到RMI服务器上,并存放到注册表中,能够被RMI客户端发现并访问。
至此,RMI服务器就建立好了!
编写RMI对象
Registry接口的方法:
void
rebind(Stringname, Remoteobj)
用提供的远程引用替换此注册表中指定的 name 绑定。
这表明,RMI对象必须是实现了Remote接口的对象。实际上,任何java上的可远程访问对象都需要实现Remote接口!
但是,仅仅实现了Remote接口的对象还不能作为RMI对象被发布。
UnicastRemoteObject类
java.rmi.server
类 UnicastRemoteObject
java.lang.Object
java.rmi.server.RemoteObject
 java.rmi.server.RemoteServer
 java.rmi.server.UnicastRemoteObject
所有已实现的接口:
直接已知子类:

public class UnicastRemoteObject
extends RemoteServer
用于导出带 JRMP 的远程对象和获得与该远程对象通信的 stub。
对于下面的构造方法和静态 exportObject 方法,正在导出的远程对象的 stub 按以下方式获得:
使用UnicastRemoteObject类的方法:
staticRemote
exportObject(Remoteobj, intport)
使用提供的特定端口导出远程对象,以便能够接收传入的调用。
可以把实现了Remote接口的类生成为RMI对象。可以发布到RMI注册表上!
生成RMI类的存根类
使用UnicastRemoteObject类的方法:
staticRemote
exportObject(Remoteobj, intport)
使用提供的特定端口导出远程对象,以便能够接收传入的调用。
使用这个方法返回的Remote对象,可以被发布到RMI的注册表上。使用动态代理,它能够自动生成stub类。这样,只要使用UnicastRemoteObject.exportObject(Remoteobj, intport)方法创建RMI注册表上的RMI对象,就不需要我们再关心stub和skeltion类的生成问题。
注意,
exportObject(Remoteobj)
使用匿名端口导出远程对象,以便能够接收传入的调用。
这个方法创建的RMI对象,客户端不能自动生成stub类!请不要使用这个方法。
请注意,
staticRemote
exportObject(Remoteobj, intport)
使用提供的特定端口导出远程对象,以便能够接收传入的调用。
我们使用这个方法时,应该使用0作为第二个参数的值。否则可能会出错!
RMI最佳实践
看了上面的文字,是不是觉得还是有些复杂呢?接下来,我们看看实际怎样编写RMI程序,你将发现RMI编程确实是非常非常简单!
实现Remote接口
RMI发布的类,必须实现Remote接口。我们可以让我们的RMI类实现的接口extend Remote接口。
这就是Remote接口。
public interface Remote {}
可 以看到,它实际上是空的,什么都没有。它仅仅是一个标记,表示Remote 接口用于标识其方法可以从非本地虚拟机上调用的接口。任何远程对象都必须直接或间接实现此接口。只有在“远程接口”(扩展 java.rmi.Remote 的接口)中指定的这些方法才可远程使用。
这种标记接口,现在实际上可以用“标注”来达到同样的目的。当初标注没有引入Java中,因此就有了这样的空接口!
另外,所有能够远程访问的方法,都必须抛出RemoteException。这是因为,远程调用可能会碰到一些如网络中断这样的错误。
可发布为RMI的类
可发布为RMI的类,它必须有参数为空的构造器,构造器必须声明为可抛出RemoteException。
建议构造其中这样写:
UnicastRemoteObject.exportObject(this, 0);
也就是说,构造器构造的是一个可以动态生成存根的RMI对象。
当然,你也可以不这么写,但是那样的话就要在注册RMI对象时多写一些代码了!
另外,所有远程调用方法的参数,必须实现Serializable接口。
发布RMI对象
下面是我的发布RMI对象的代码:
//这是RMI服务器使用的端口,我使用了配置文件
String rMIPort = Config.getInstance().get("RMIPort");
//这样就在指定的端口创建并启动了RMI服务器。否则,你需要在命令行中输入:
//start rmiregistry
//手工启动RMI服务器
Registry registry = LocateRegistry.createRegistry(new Integer(rMIPort)
.intValue());
//我在配置文件中配置了一些RMI类,每一个包括注册表的名字和RMI类的全名
Map<String, String> rmis = Config.getInstance().getRmis();
Set<Map.Entry<String, String>> entrys = rmis.entrySet();
//用叠代器全部拿到,然后一个个放到RMI注册表中,公布出来!
Iterator it = entrys.iterator();
while (it.hasNext()) {
Map.Entry<String, String> tmp = (Map.Entry<String, String>) it
.next();
try {
//创建RMI对象,可以动态生成存根
Remote stub = (Remote) Class.forName(tmp.getValue())
.newInstance();
//以指定的名字发布RMI对象到注册表
registry.rebind(tmp.getKey(), stub);
} catch (InstantiationException e) {
/*
*/
e.printStackTrace();
} catch (IllegalAccessException e) {
/*
*/
e.printStackTrace();
} catch (ClassNotFoundException e) {
/*
*/
e.printStackTrace();
} catch (RemoteException e) {
/*
*/
e.printStackTrace();
}
}
访问RMI对象的客户端
访问RMI对象的客户端也是非常非常简单的。
如:
//RMI服务器的IP地址
String rMIHost=Config.getInstance().get("RMIHost");
//RMI服务器的端口
String rMIPort=Config.getInstance().get("RMIPort");
//得到RMI服务器注册表的引用
Registry registry = LocateRegistry.getRegistry(rMIHost,new Integer(rMIPort).intValue());
//查找并得到RMI对象的实例。
IServerREQTerminalConfigService stub = (IServerREQTerminalConfigService) registry.lookup("ServerREQTerminalConfigService");
//调用远程RMI服务器上的对象的方法!
stub.rmiRemote();
就这么简单!
结语
在JDK5发布之前,使用RMI是一件非常繁琐的事情。甚至很多程序员把EJB当作对RMI的封装,当作RMI的简化版!
而今,RMI已经得到了巨大的改进。作为Java平台上性能最好远程访问技术,如今也是最简单的远程访问技术,RMI理应得到更广泛的应用。
分享到:
评论

相关推荐

    Domino的Java编程指南

    - **通过IIOP测试连接**:使用IIOP协议,Java客户端可以透明地与Domino服务器进行通信,类似于RMI(远程方法调用)。 - **通过IOR测试连接**:IOR是对象引用的二进制表示,可以用来直接定位和调用远程对象。 - **...

    JDK_API_1.6.zip

    这份文档详细阐述了Java SE 6平台的类库,包括各种类、接口、枚举和注解,涵盖了Java语言的核心特性以及其丰富的类库,为开发人员提供了全面的编程指南。 一、Java基础 JDK 1.6中的Java基础部分主要涉及Java语言的...

    JDK 1.1 Documentation(EN)

    5. **国际化支持**:JDK 1.1添加了对多种语言和文化的国际化的支持,通过`java.text`和`java.util.Locale`类实现。 6. **Applet API**:JDK 1.1进一步改进了Java小程序(Applet)的API,使得网页内嵌的小程序更加...

    Bluprint JDK1.1

    5. **套接字通信的改进**:加强了网络编程的API,为TCP/IP通信提供更好的支持。 6. **JNI (Java Native Interface)**:允许Java代码调用本地(非Java)代码,增强了Java与其他语言的互操作性。 7. **Applet增强**...

    jdk20-troubleshooting-guide.pdf

    4. 网络和通信问题:解决Java应用程序中的网络和通信问题,包括Socket编程、RMI和Web服务等。 5. 数据库问题:解决Java应用程序中的数据库问题,包括JDBC、SQL和数据库性能优化等。 6. 多线程和并发问题:解决Java...

    JDK12-java-management-extensions-guide.pdf

    5. **JMX Tools**:JDK自带了一些内置的JMX工具,例如`jconsole`和`jinfo`,它们可以帮助开发者直接通过命令行或者图形界面来监控和管理Java应用程序。这些工具展示了JMX的强大功能,同时也为自定义监控工具提供了...

    java网络编程

    本书重点介绍了JDK 1.4和1.5(即J2SE 5)中的网络API更新,包括TCP和UDP socket、服务器socket、URL和URI处理、组播、以及特殊用途的API如JavaMail。它不仅讲解API,还通过丰富的示例代码展示了API的实际应用,涉及...

    Java应用开发指南配套PPT

    《Java应用开发指南》这本书深入浅出地介绍了Java编程的基本概念和技术,旨在帮助读者掌握Java编程的核心技能。配套的PPT进一步强化了书中的理论知识,并通过实例和图解帮助理解复杂的概念。 **PPT内容概览** 1. *...

    WildFly管理员手册之配置指南-带书签

    JBoss 4.2要求JDK版本至少为5。JBoss的Web容器采用了JBossWeb v2.x版本,集成了Tomcat 6。 JBoss的部署机制也发生了变化,例如,deploy/jboss-web.deployer目录替换了之前的deploy/jbossweb-tomcat55.sar目录。...

    java程序员技术体系

    Java提供了丰富的图形用户界面(GUI)库,如AWT、Swing、SWT和JFace,以及用于网络编程的API,如Applet、Socket/TCP/UDP、NIO、RMI和CORBA,这些使得Java能够创建桌面应用和分布式系统。 进一步深入,Java的高级...

    dubbo源码解析

    2. Spring框架开发及应用:建议阅读夏昕的《SpringGuide》、《Hibernate开发指南》和《Spring实战》,对于深入学习Spring框架有帮助。另外,《Spring源码解析》对于理解Spring框架的工作原理有很大的帮助。jeecg开源...

    dubbo源码解析 1 pdf2.0

    推荐的书籍包括《SpringGuide》、《Hibernate开发指南》、《Spring实战》,以及深入理解的《Spring源码解析》。 3. Java网络编程:熟悉Java网络编程相关知识,包括《Java_TCPIP_Socket网络编程.pdf》和《Java网络...

    J2EE开发工具使用方法详解

    - **JDK的下载与安装**:提供了JDK的下载链接,并指导用户完成安装过程,包括环境变量的配置,确保JDK能在系统中正常工作。 - **Tomcat服务器的下载与安装**:Tomcat是常用的Java Web应用服务器,本章节指导用户如何...

    JAVA基础教程

    综上所述,Java基础教程涵盖了Java语言的基础概念、核心特性和编程实践,为初学者提供了入门指南,同时也为专业开发者提供了深入理解和应用Java技术的基石。随着技术的不断进步,Java将继续在其发展历程中扮演关键...

Global site tag (gtag.js) - Google Analytics