При создании приложения RMI на двух разных машинах: клиент и сервер. Где определить интерфейс клиента или сервер? - PullRequest
0 голосов
/ 01 июля 2019

Я хочу написать приложение 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);
        }
    }

}

когда я запускаю этот код на той же машине, он работает нормально, отображается результат добавления метода, но на другой машине он показывает следующее сообщение.

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

1 Ответ

1 голос
/ 01 июля 2019

Где мы должны определить наш интерфейс Клиент или сервер?

Простой: вам нужен интерфейс на обеих сторонах.

Клиент знает этот интерфейс, и в основном это «единственная вещь», которую он знает: есть некоторый интерфейс, который определяет поведение (методы), которое может использовать клиентский код.

Сервер знает этот интерфейс, и реализует it.

Этот интерфейс является основной вещью, которая «связывает» клиента и сервер (концептуально).Они оба знают, что есть какой-то интерфейс AdditionI.Клиенту это понадобится, поэтому он

  • сначала определит службу, которая поддерживает этот интерфейс
  • , когда такая служба найдена, клиент знает, как вызвать соответствующий метод добавления

Сервер, с другой стороны, использует интерфейс для регистрации своей реализации в качестве службы ... которую затем могут вызывать клиенты.

Следовательно, в основном у вас есть три различных частей в вашем исходном коде:

  • common : содержит этот AdditionI интерфейс
  • клиент :дополнительный код, необходимый для идентификации и последующего использования этой службы добавления
  • сервер : дополнительный код для реализации и регистрации службы

И обратите внимание: это исключение java.lang.ClassNotFoundException действительно базовый.Он говорит вам, что JVM, выполняющая некоторый код, не нашла некоторый класс.

Другими словами: ваша настройка пути к классам как-то нарушена.Просто исследуйте это исключение (вы можете найти бесконечную бесконечную документацию о таких базовых вещах, см., Например, здесь ).Скорее всего, все сводится к следующему: убедиться, что некоторые файлы .class находятся в пути к классам ... там, где они вам нужны.И первая часть уже говорит вам, куда нужно идти на занятия!

...