远程方法调用,可以使java程序之间的访问跨jvm或网络。

解决方案 »

  1.   

    远程方法调用 远程方法调用(Remote Method Invocation ,RMI)使用户能访问在另一 
    主机上的Java对象,并远程调用其方法。程序的对象是客户,而远程对象是服 
    务器。远程对象也可以是另一个远程服务对象的客户。通过使用持续性(串行 
    化和解串行化),本地对象和原始类型值可以作为参数传递给远程对象。这种 
    方式允许Java程序可以利用分布式计算将工作量分散到多个Java虚拟机上。 工作原理 
    RMI系统结构,在客户端和服务器端都有几层结构。 
    --------- ---------- 
    | 客户 | | 服务器| 
    ---------- ---------- 
    | | 
    ------------- ---------- 
    | 占位程序 | | 骨干网 | 
    -------------- ----------- 
    | | 
    ------------------------------------ 
    | 远 程 引 用 层 | 
    ------------------------------------ 
    | | 
    ------------------------------------ 
    | 传 输 层 | 
    ------------------------------------ 方法调用从客户对象经占位程序(Stub)、远程引用层(Remote Reference 
    Layer)和传输层(Transport Layer)向下,传递给主机,然后再次经传 
    输层,向上穿过远程调用层和骨干网(Skeleton),到达服务器对象。 
    占位程序扮演着远程服务器对象的代理的角色,使该对象可被客户激活。 
    远程引用层处理语义、管理单一或多重对象的通信,决定调用是应发往一个 
    服务器还是多个。传输层管理实际的连接,并且追追踪可以接受方法调用的 
    远程对象。服务器端的骨干网完成对服务器对象实际的方法调用,并获取返 
    回值。返回值向下经远程引用层、服务器端的传输层传递回客户端,再向上 
    经传输层和远程调用层返回。最后,占位程序获得返回值。 要完成以上步骤需要有以下几个步骤: 
    1、生成一个远程接口 
    2、实现远程对象(服务器端程序) 
    3、生成占位程序和骨干网(服务器端程序) 
    4、编写服务器程序 
    5、编写客户程序 
    6、注册远程对象 
    7、启动远程对象 具体实现如下: 
    1、生成一个远程接口 
    package c15.ptime; 
    import java.rmi.*; public interface PerfectTimeI extends Remote { 
    long getPerfectTime() throws RemoteException; 
    } 2、实现远程对象(服务器端程序) 
    package c15.ptime; 
    import java.rmi.*; 
    import java.rmi.server.*; 
    import java.rmi.registry.*; 
    import java.net.*; public class PerfectTime 
    extends UnicastRemoteObject 
    implements PerfectTimeI { 
    public long getPerfectTime() 
    throws RemoteException { 
    return System.currentTimeMillis(); 
    } public PerfectTime() throws RemoteException { 
    super(); 
    } public static void main(String[] args) { 
    System.setSecurityManager( 
    new RMISecurityManager()); 
    try { 
    PerfectTime pt = new PerfectTime(); 
    Naming.rebind( 
    "//zhouty:2005/PerfectTime" , pt); 
    System.out.println("Ready to do time"); 
    } catch(Exception e) { 
    e.printStackTrace(); 


    } 4、编译远程对象(服务器端程序) 
    javac -classpath . -d . PerfectTime.java 5、生成根和干(占位程序和骨干程序) 
    rmic -classpath . -d . c15.ptime.PerfectTime 6、注册远程对象 
    start rmiregistry 2005 7、启动服务器端程序 
    java -Djava.rmi.server.codebase=file:///d:/TestRMI/ c15.ptime.Per 
    fectTime 8、编写客户端程序 
    package c15.ptime; 
    import java.rmi.*; 
    import java.rmi.registry.*; public class DisplayPerfectTime { 
    public static void main(String[] args) { 
    System.setSecurityManager( 
    new RMISecurityManager()); 
    try { 
    PerfectTimeI t = 
    (PerfectTimeI)Naming.lookup( 
    "192.168.0.171:2005/PerfectTime"); 
    for(int i = 0 ; i < 10; i++) 
    System.out.println("Perfect time =" + 
    t.getPerfectTime()); 
    } catch(Exception e) { 
    e.printStackTrace(); 


    } 9、编译客端程序 
    javac -classpath . -d . DisplayPerfectTime.java 10、修改JVM的配置文件 (客户机和服务器的都需要经过修改) 
    %JRE_HOME%\policytool.exe 11、启动客户程序 
    java -classpath . c15.ptime.DisplayPerfectTime 12、返回结果 Perfect time =967274884390 
    Perfect time =967274884450 
    Perfect time =967274884450 
    Perfect time =967274884450 
    Perfect time =967274884500 
    Perfect time =967274884500 
    Perfect time =967274884560 
    Perfect time =967274884610 
    Perfect time =967274884610 
    Perfect time =967274884610