请教一个RMI原理问题RMI分为3部分,客户端,服务器端,RMIRegistery我们不妨就借用网上的一个简单例子来说明问题这是远程对象
import java.rmi.*;public interface Compute extends Remote{
    
    public double add(double a,double b) throws RemoteException;
    
}
两点要求1,继承标记接口Remote。identify interfaces whose methods may be invoked from a non-local virtual machine.标识该接口可以被非本地VM调用呗。2,里面每个方法都要抛出RemoteException
业务接口的实现类,也就是做实事的类import java.rmi.server.*;
import java.rmi.*;public class ComputeImpl extends UnicastRemoteObject implements Compute
{
    //要在构造方法抛出异常
    public ComputeImpl() throws RemoteException{}
    
    public double add(double a,double b){
        return a+b;
    }
}编写一个Serverimport java.rmi.*;public class Server
{    public static void main(String[] args) throws Exception
    {
        ComputeImpl c = new ComputeImpl();
        Naming.bind("rmi://localhost:8888/compute",c);//compute别名
    }}
客户端import java.rmi.*;public class Client
{
    public static void main(String[] args) throws Exception
    {
        Compute c = (Compute)Naming.lookup("rmi://localhost:8888/compute");//rmiregistry首先响应
        //实际c是Stub对象
        System.out.println(c.getClass());
        System.out.println(c.add(12.3,34));
    }   
}
最后还要
rmiregistry 8888
现在的问题是。按照资料的描述
客户端,服务器端,RMIRegistery分别属于不同的JVM
那么这3部分就可以运行在3台不同的机器上
但是请注意,假设现在是运行在不同机器上
服务器端上的这段代码就很可疑拉
public class Server
{    public static void main(String[] args) throws Exception
    {
        ComputeImpl c = new ComputeImpl();
        Naming.bind("rmi://localhost:8888/compute",c);//compute别名
    }}因为这是调用RMIRegistery提供的服务来进行注册但是RMIRegistery所在的机器上不一定有ComputeImpl 这个类哦,更不要说c这个ComputeImpl 对象拉
这又怎么做绑定呢??
我看到的范例代码都是本地做绑定
Naming.bind("rmi://localhost:8888/compute",c);//compute别名
即运行RMIRegistery与服务器端在同一台机器,这当然能够找到远程接口,远程对象啊那么是否意味RMIRegistery与服务器端必须运行在同一机器上呢??请大虾指教

解决方案 »

  1.   

    这还真没考虑过
    也许你可以通过别的方法从另一台机器上得到c,然后绑定
    另外,绑定的时候用localhost在客户端解析为本机地址
      

  2.   

    http://www3.ccw.com.cn/club/essence/200305/16517.htm
      

  3.   

    应该可以不在同一JVM和不同PC
    RMIregistery 是一个注册服务器,他启动于一个PC,
    当在SERVER调用Naming.bind("rmi://localhost:8888/compute",c);
    注册时候他连接到注册服务器,注册c远程对象
    这时, 只要RMIregistery不关闭,
    就可以在CLIENT中 Compute c = (Compute)Naming.lookup("rmi://localhost:8888/compute");
    得到远程对象。不知我理解的对不对。
      

  4.   

    今天又看到一个资料说是RMIregistery 必须于server端的类在一个目录下执行
    那么这就意味着RMIregistery 必须与server端在同一机器上
    我晕了
      

  5.   

    我刚刚试了一下,确实如此,
    RMIregistery 必须于server端的类在一个目录下执行
    如果这样
    为什么有大虾会说
    RMIregistery 可以与server端不在同一机器上
    请大虾指教啊