如何在java中启动远程_如何在Java中实现远程方法调用

如何在Java中实现远程方法调用 经乾、郭镇、赵伟     一、Java中的远程方法调用   远程方法调用(Remote Method Invocation, RMI)是Java1.1引入的分布式对象软件包,它的出现简化了在多台机器上的Java应用之间的通信。相比CORBA,RMI功能较弱且只能用于Java系统。    二、实现一个简单的RMI   要使用RMI,必须构造四个主要的类:远程对象的本地接口、RMI客户、远程对象实现和RMI服务器。RMI服务器生成远程对象实现的一个实例,并用一个特殊的URL注册它,RMI客户在远程服务器上查找对象,若找到就把它转换成本地接口类型,然后像一个本地对象一样使用它。下面是一个简单的RMI例子,远程对象只返回一个消息字符串。要使这个例子更有价值,我们需要做的就是完善远程对象实现类。    1.远程对象的本地接口类(Rem.java)   该类仅仅是一个接口,而不是实现,RMI客户机可以直接使用它,RMI服务器必须通过一个远程对象来实现它,并用某个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,所以还应在程序中输入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。请将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.”

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值