如安在Java中完成遥程方式挪用
经坤、郭镇、赵伟
一、Java中的远程方式挪用
远程办法调用(Remote Method Invocation, RMI)是Java1.1引进的散布式对象软件包,www.hirain.orghttp://www.hirain.org/,它的呈现简化了在少台呆板上的Java利用之间的通讯。比拟CORBA,RMI功效较弱且只能用于Java体系。
两、实现一个简略的RMI
要使用RMI,必须结构四个重要的类:远程对象的本地接口、RMI客户、远程对象实现和RMI服务器。RMI服务器天生远程对象实现的一个实例,并用一个特别的URL注册它,RMI客户在远程服务器上查找对象,若找到就把它转换本钱地接口范例,然后像一个本地对象一样利用它。下里是一个简略的RMI例子,远程对象只前往一个新闻字符串。要使这个例子更有代价,人们须要做的便是完美远程对象实现类。
1.远程对象的原天接口类(Rem.java)
当类仅仅是一个接口,蚕丝被http://www.okoneclick.info/,而没有是实现,RMI客户机能够直接使用它,RMI服务器必须通过一个远程对象来实现它,摩托罗拉对讲机http://www.gsd2.com/,并用某个URL注册它的一个实例。
import java.rmi.*;
public interface Rem extends Remote { public String
getMessage() throws RemoteException;}
外地接口(Rem)必需是大众的,不然客户机正在加载一个完成当接心的遥程工具时便会犯错。别的,它还必须自java.rmi.Remote承继而来,交口中的每一个方式皆必需扔出长途非常java.rmi.RemoteException。
2.RMI客户类(RemClient.java)
RMI客户利用Naming.lookup正在指订的远程主机上查觅对象,若觅到便把它转换成外地交心Rem范例,然后像一个原天对于象一样使用它。取CORBA差别之处在于RMI客户必需晓得降求远程效劳主机的URL,那个URL能够通功rmi://host/path或者rmi://host:port/path来指订,假如省详端标语,便利用1099。Naming.lookup能够发生三个非常:RemoteException、NotBoundException、MalformedURLException,三个平凡皆须要捕捉。RemoteException、Naming和NotBoundException在java.rmi.*中界说,MalformedURLException在java.net.*中界说。别的,客户机将背远程对象传送串止化对于象Serializable,金蝶k3财务可能出现的问题,以是还当在步伐中输进java.io.*。
import java.rmi.*;
import java.net.*;
import java.io.*;
public class RemClient {
public static void main(String[] args) {
try {
String host = (args.length > 0) ? args[0] :
"localhost"; file://服从令止读与长途主机实
file://通功URL正在长途主机上查觅工具,并把它转化为外地交心Rem范例
Rem remObject=(Rem)Naming.lookup("rmi://" + host +
"/Rem");
System.out.println(remObject.getMessage());
file://调用远程对象的办法
} catch(RemoteException re)
{System.out.println("RemoteException: " + re);
} catch(NotBoundException nbe)
{System.out.println("NotBoundException: " + nbe);
} catch(MalformedURLException
mfe){System.out.println("MalformedURLException:"+ mfe);
}}}
3.远程对象实现类(RemImpl.java)
那个类实正真隐RMI客户挪用的远程对象,它必须自UnicastRemoteObject承继,其结构函数当扔出RemoteException非常。
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
public class RemImpl extends UnicastRemoteObject implements
Rem {
public RemImpl() throws RemoteException {}
file://构制函数扔出RemoteException异常
public String getMessage() throws RemoteException {
return("Here is a remote message."); }}
file://背RMI客户前往一个新闻串
4.RMI效劳器类(RemServer.java)
当类创立远程对象实隐RemImpl的一个实例,然后用一个特定的URL来注册它,所谓注册便是通功Naming.bind或者Naming.rebind来将RemImpl实例绑定到URL上。
import java.rmi.*;
import java.net.*;
public class RemServer {
public static void main(String[] args) {
try {
RemImpl localObject = new RemImpl(); file://天生远程对象实隐的一个真例
Naming.rebind("rmi:///Rem", localObject);
file://将遥程工具真例绑订到rmi:///Rem上
}catch(RemoteException
re){System.out.println("RemoteException:"+re);
}catch(MalformedURLException mfe)
{System.out.println("MalformedURLException: "+mfe);
}}}
三、编译和运转
1. 编译RMI客户和服务器,那将主动编译远程对象的原天接口和远程对象实现
javac RemClient.java file://主动编译远程对象的本地接口Rem.java
javac RemServer.java file://主动编译远程对于象完成RemImpl.java
2. 天生客户启接模块和服务器框架
rmic RemImpl
这将结构RemImpl_Stub.class和RemImpl_Skeleton.class,tcpdump中文MAN手册。请将Rem.class、RemClient.class和RemImpl_Stub.class拷贝到RMI客户机,将Rem.class、RemImpl.class
、RemServer.class和RemImpl_Skeleton.class拷贝到RMI服务器。
3. 开动RMI注册
rmiregistry
file://在服务器上施行。不管有几个远程对象,本操纵只需做一次
4. 运转
java RemServer.class
file://开动RMI效劳器(在服务器上施行)
java RemClient.class
file://开动RMI客户,将输出“Here is a remote message.”
d.height = height; d.width = width; } public synchronized
Dimension getValues(){ // Ooops! Breaks encapsulation return d; }
}