查询Java RMI的骨架类

时间:2014-04-10 03:27:29

标签: java rmi

在machine1 / folder1中,我放置了HelloClient.java& HelloInterface.java 并运行java1.5编译:

javac HelloClient.java HelloInterface.java

在machine2 / folder2中,我放置了HelloInterface.java / Hello.java / HelloServer.java个文件并运行了java 1.5编译:

 javac *.java` //here `HelloInterface` definition is required by Hello Class only for compilation.

存根/骨架类也会在machine2中生成。

我将Hello_stub.class复制到machine1 / folder1

接下来,我运行了对象注册表

rmiregistry &

并启动服务器,将对象绑定到该注册表。

java -Djava.security.policy=policy HelloServer &

策略文件的位置

grant{
     permission  java.security.AllPermission;
}     

然后运行客户端:

java HelloClient testing abc

我的问题是:

1)当我们从客户端程序调用{​​{1}}与machine2通信时,machine1上的HelloClient.class正在使用Hello_stub.class, 但是我不清楚hello.say()调用机器2上的Hello_skel.class实例?你能帮我理解一下吗?

2)来自C中的套接字编程背景,我如何可视化HelloServer.class / socket()部分客户端程序和connect() / socket() / bind() / listen()这个RMI框架中的服务器程序是什么?

我写了下面的接口(HelloInterface.java)

accept()

我编写了下面的类(Hello.java),其对象的方法将从远程访问。

import java.rmi.*;
public interface HelloInterface extends Remote{
          public String say(String msg) throws RemoteException;
    }

我编写了Server程序(HelloServer.java),它使用rmiregistry程序注册'Hello'对象。

import java.rmi.*;
import java.rmi.server.*;
public class Hello extends UnicastRemoteObject implements HelloInterface {
        private String message;
        public Hello(String msg) throws  RemoteException{
               message = msg;
        }

        public String say(String m) throws RemoteException{
               return new StringBuffer(m).reverse().toString();
        } 
}

我编写了调用远程方法'say'

的客户端程序(HelloClient.java)
import java.rmi.*;
import java.rmi.server.*;
public class HelloServer{
       public static void main(String argv[]){
           if(System.getSecurityManager() == null)
                   System.setSecurityManager(new RMISecurityManager());
           try{
                   Naming.rebind("Hello", new Hello("Hello, world!"));
                   System.out.println("Server is running");
              }catch(Exception e){
                    System.out.println("Hello server failed: " + e);
              }
       }
}   

1 个答案:

答案 0 :(得分:1)

// here HelloInterface definition is required by Hello Class only for compilation

没有。 HelloServerHelloClient也需要进行编译,并且在运行时,服务器和客户端以及RMI注册表都需要它。

  

存根/骨架类也会在machine2中生成。

没有。自1998年以来,RMI骨架已经过时。除非您使用rmic选项-v1.1-vcompat,,否则您根本不会生成一个,但您不需要使用它们。如果您只是将rmic添加到super(0)构造函数中,则自Java 1.5以来甚至不需要使用Hello本身。

  

我将Hello_stub.class复制到machine1 / folder1

此处还需要HelloInterface.class

  当我们从客户端程序调用hello.say()与machine2进行通信时,machine1上的HelloClient.class正在使用Hello_stub.class

正确。

  

[我]不清楚HelloServer.class调用机器2上的Hello_skel.class实例

根本不会调用它,除非您使用rmic -v1.1,,在这种情况下,RMI 调用以在RMI运行时系统和Hello对象之间进行调解。它根本与HelloServer类没有任何关系。

  

来自C中的套接字编程背景,我如何可视化socket()/ connect()客户端程序的一部分

RMI根据需要创建连接,对它们进行池化,并在它们空闲时关闭它们。调用Naming.lookup(),和另一个调用远程方法需要连接。

  这个RMI框架中的服务器程序的

和socket()/ bind()/ listen()/ accept()pasrt?

导出远程对象会创建一个侦听套接字,或者共享一个已由RMI创建的套接字。 RMI运行时系统调用accept(),从它所用的远程对象的请求头中解决,并通过请求中的参数通过反射(或旧骨架)调用该远程对象,并发送结果或异常(如果有的话)回到客户端。

NB:

  1. 除非您使用的是RMI代码库功能,否则不需要SecurityManager或.policy文件或-Djava.security.policy参数。

  2. 我没有在msg中看到Hello.参数和实例成员的用途。您没有使用它。

  3. 您真的不需要HelloServer.您可以将main()方法放入Hello.

  4. 您的客户端不会在其查找的对象上调用任何远程方法。想必要添加一下吗?