【问题标题】:When creating an RMI application on two different machines Client and Server Where should we Define our Interface Client side or Server side?在两台不同的机器上创建 RMI 应用程序时客户端和服务器我们应该在哪里定义我们的接口客户端或服务器端?
【发布时间】:2019-07-01 18:01:02
【问题描述】:

我想用两台笔记本电脑编写一个 RMI 应用程序,这两个数字相加?我已经将一台笔记本电脑作为我的服务器,另一台笔记本电脑作为我的客户端。当我们想定义从远程接口扩展的接口时,我应该在哪台机器上定义这个接口是客户端还是服务器端?请帮忙。

我已经使用一台机器制作了一个 RMI 应用程序,它工作正常我已经在同一个包中定义了接口,但是当我在不同的机器上工作时它不起作用。

public interface AdditionI extends Remote {
    public int add(int x ,int y) throws RemoteException;
}

public class Server extends UnicastRemoteObject implements AdditionI {

   public Server() throws RemoteException {}

   @Override
   public int add(int x, int y) throws RemoteException {
       return x+y;
   }

   public static void main(String ar [])throws RemoteException {
       try
       {
           Registry reg = LocateRegistry.createRegistry(2177);
           reg.rebind("Add", new Server());
           System.out.println("Server is ready");
       }
       catch(Exception e)
       {
           System.out.println("Error "+ e);
       }
   }
}



public class Client {

    public static void main(String ar[])throws RemoteException {
        try {
            Registry reg = LocateRegistry.getRegistry("localhost",2177);
            AdditionI ad = (AdditionI)reg.lookup("Add");
            System.out.println("REsult:"+(ad.add(10, 5)));
        } catch (Exception e) {
            System.out.println("Error"+e);
        }
    }

}

当我在同一台机器上运行此代码时,它工作正常,显示方法 add 的结果,但在不同的机器上它显示以下消息。

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: java.lang.ClassNotFoundException:

【问题讨论】:

  • 您是否尝试过将 AdditionI 接口单独编译为 Jar,然后在服务器和客户端计算机上包含所述 jar?
  • 两者都不是。使用共享包。
  • 澄清请求:您的问题得到充分回答了吗?如果是这样,请考虑accepting 一个答案。这样做有助于未来的读者确定问题是否已解决,并对花时间回答您的人表示感谢。否则请提供反馈,以便人们进一步调整他们的答案。

标签: java interface rmi


【解决方案1】:

我们应该在哪里定义我们的接口客户端或服务器端?

简单:两侧都需要接口。

客户端知道那个接口,基本上它是它知道的“唯一的东西”:有一些接口定义了客户端代码可以使用的行为(方法)。

服务器知道该接口并实现它。

该接口是“链接”客户端和服务器(概念上)的基本东西。他们都知道有一些接口AdditionI。客户需要它,所以它

  • 首先确定支持该接口的服务
  • 当找到这样的服务时,客户端知道如何调用相应的添加方法

另一方面,服务器使用接口将其实现注册为服务......然后客户端可以调用。

因此,您的源代码中基本上有三个不同的部分:

  • common:包含AdditionI 接口
  • 客户端:识别和以后使用该附加服务所需的附加代码
  • 服务器:实现和注册服务的附加代码

请注意:java.lang.ClassNotFoundException 异常是非常基本的。它告诉您运行某些代码的 JVM 没有找到某个类。

换句话说:你的类路径设置被破坏了。只需研究该异常(您可以找到关于此类基本事物的无穷无尽的文档,例如参见here)。最有可能归结为:确保某些 .class 文件位于类路径中……您需要它们的地方。第一部分已经告诉你需要去哪里上课!

【讨论】:

  • 我在两台机器上定义了相同的接口,但它给了我在我的问题中提到的异常。我应该从界面创建一个jar文件并将其添加到两台机器上还是我需要在两边都定义它?
  • @ijazahmadkhpalwaak ClassNotFoundException 说你没有在两台机器上定义相同的接口。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-06-29
  • 1970-01-01
  • 2020-08-10
  • 2013-08-10
  • 1970-01-01
相关资源
最近更新 更多