简介
上一节介绍了如何编写RMI的程序范例,在那个例子中可以看到RMI的客户端和服务端交互的方式和如何建立连接。
在这一节我们将会重构一下Client的链接方式,以前是直接使用Naming获得服务器对象,这一节我们将换用上下文帮助我们管理服务器的链接。
上下文即Context,他可以管理RMI的对象,自动帮助我们管理各个平台的工厂创建。EJB的应用也是使用Context帮助管理RMI对象。
在每个项目中应该少用HardCode值,这就需要一个配置文件设置,使用Context的时候,我们可以在程序中将属性值创建进去,RMI的配置中至少需要两个必不可少的值,java.naming.factory.initial 和java.naming.provider.url 。这两个值可以放入到jndi.properties中,这个配置文件将会被Context读取。设置Factory创建指定传输协议的对象,比如
两个常用的,IIOP 和 LDAP,IIOP的URL如同 iiop://mycosnamingserver,使用的工厂是com.sun.jndi.cosnaming.CNCtxFactory,LDAP的URL如同
ldap://myldapnameserver,这个参数的设置稍微复杂一点,请参考
《走出JNDI迷宫》 -- Daniel Would。
对于RMI的传输协议设置请看jndi.properties设置。
jndi.properties
java.naming.factory.initial=com.sun.jndi.rmi.registry.RegistryContextFactory
java.naming.provider.url=rmi://127.0.0.1:2500
Client.java重构
package remote.test.client;
import javax.naming.InitialContext;
import javax.rmi.PortableRemoteObject;
import remote.test.HelloTask;
import remote.test.HelloTaskImpl;
import remote.test.IHello;
public class HelloClient {
public static void main(String[] args) {
try {
//IHello hi = (IHello) Naming.lookup("rmi://127.0.0.1:2500/hello");
InitialContext ctx = new InitialContext();
Object obj = ctx.lookup("hello");
IHello hi = (IHello)PortableRemoteObject.narrow(obj,IHello.class);
HelloTask task = new HelloTaskImpl();
for (int i = 0; i < 10; i++) {
System.out.println(hi.say(task));
}
} catch (Exception e) {
e.printStackTrace();
}
}
}
连接地址和端口号将从java.naming.provider.url获得,使用InitialContext能够有效地帮助我们再各个平台上搭建我们的服务器,使用各种协议来应对各种平台所带来的问题。服务端的代码没有改动,请参考上一节的文章《使用Eclipse编写Java RMI程序详解》