需要帮助更好地理解RMI

3

我正在学习RMI,我已经做了一些类似以下的事情:

接口

import java.rmi.*;

public interface IRemote extends Remote {
    public void say() throws RemoteException;
}

服务器

 import java.rmi.*;
 import java.rmi.server.*;

 public class Server extends UnicastRemoteObject implements IRemote{

     public Server() throws RemoteException{}

        public void say() throws RemoteException{
            System.out.println("I am saying Hello World...");
        } 

        public static void main (String[] argv) {
           try {
                          Naming.rebind ("myserver", new Server());
                          System.out.println ("Server is ready.");
            } catch (Exception e) {
                System.out.println ("Hello Server failed: " + e);
                  }
         }
     }

客户端

  import java.rmi.*;

   class Client{
      public static void main(String args[]){
            try{
                  IRemote obj = (IRemote) Naming.lookup ("rmi://MYPCNAME/myserver");
                        obj.say();
                }catch(Exception e){
                System.out.println("Exception : "+e);
            }
       }
 }

首先,我要启动RMI注册表才能运行。

start rmiregistry 然后 java Server 最后 java Client

当我将这三个文件放在同一个包中时,一切都很好。但是这不是RMI的全部。我应该能够将Client放在其他机器或位置上,然后从那里调用Server方法。

但是,当我更改Client.java的包并尝试编译它时,我会收到错误:

Client.java:6: error: cannot find symbol IRemote obj = (IRemote) Naming.lookup ("rmi://MYPCNAME/myserver"); symbol: class IRemote location: class Client

它说找不到IRemote,而IRemote存在于Server的包中。我想知道如何使此功能正常工作?无论是Client和Server在不同的包中还是在不同的机器上?

1个回答

2
我怀疑问题是缺少import语句。
ClientIRemote在同一包中时,您可以在不需要导入的情况下引用它。一旦您移动了接口,您的Client类就不再知道如何找到它。

嗯,我非常清楚这一点......!但是当我们将客户端程序移动到另一台计算机上并在另一台计算机上运行服务器时呢?那么你认为你该如何导入接口?(这就是RMI的全部内容) - gprathour
将您的接口打包在一个 JAR 文件中,然后编译客户端和服务器以针对该 JAR 文件进行。 - David Grant
你想说的是,我们需要在客户端和服务器端都有接口吗? - gprathour
不,你需要在两侧都有接口。 - David Grant
没问题! :) 你确定这件事吗?在标准的Java RMI工作方式中,接口应该在两端都可用吗?有任何参考资料吗? - gprathour
让我们在聊天中继续这个讨论:http://chat.stackoverflow.com/rooms/17170/discussion-between-david-grant-and-gps - David Grant

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接