Java RMI NotBoundException - PullRequest
       107

Java RMI NotBoundException

0 голосов
/ 06 августа 2020

Я работаю над одним из школьных заданий для сервера RMI.

// Interface
public interface CarPlate extends Remote {
  Car createPlate(Car car) throws RemoteException;
}
// Interface Implementation
public class CarPlateImpl extends UnicastRemoteObject implements CarPlate {
  public CarPlateImpl() throws RemoteException { super(); }

  @Override
  public Car createPlate(Car car) throws RemoteException {
    System.out.println("Car plate registration service was called...");
    car.setPlate("car" + car.hashCode());
    return car;
  }
}
// Server
public class CarServer {
  public static void main(String[] args) {
    ServerSocket serverSocket;
    try {
      serverSocket = new ServerSocket(4000);
      System.out.println("CarServer is running for cars registration");
      System.out.println("Listening for a connection...");

      Socket socket = serverSocket.accept();
      ObjectOutputStream oosToClient = new ObjectOutputStream(socket.getOutputStream());
      ObjectInputStream oisFromClient = new ObjectInputStream(socket.getInputStream());

      // RMI
      CarPlate carPlate = new CarPlateImpl();
      Registry registry = LocateRegistry.createRegistry(1099);
      registry.rebind("CarPlateService", carPlate);

      Car car;
      try {
        while (true) {
          car = (Car)oisFromClient.readObject();
          System.out.println("Received car from client: " + car);
          carPlate.createPlate(car); // Create car plate using RMI server
          oosToClient.writeObject(car);
          oosToClient.flush();
          System.out.println("Sending new car to client...");
        }
      } catch (ClassNotFoundException | IOException e) {
        e.printStackTrace();
      }

      // Close socket connections
      oosToClient.close();
      oisFromClient.close();
      socket.close();
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

// Client
public class CarClient {
  public static Car registerCar(Car car) {
    Car updatedCar = null;
    try {
      CarPlate carPlate = (CarPlate) Naming.lookup("rmi://localhost:1099/CarPlateService");
      updatedCar = carPlate.createPlate(car);
    } catch (Exception e) {
      e.printStackTrace();
    }
    return updatedCar;
  }

  public static void main(String[] args) {
    Socket clientSocket;

    try {
      clientSocket = new Socket(InetAddress.getByName("localhost"), 4000);
      System.out.println("Connected to " + clientSocket.getInetAddress().getHostName());

      ObjectInputStream oisFromServer = new ObjectInputStream(clientSocket.getInputStream());
      ObjectOutputStream oosToServer = new ObjectOutputStream(clientSocket.getOutputStream());
      System.out.println("IO streams connected to the socket");

      Car[] cars = new Car[4];
      cars[0] = new Car("Nissan GT-R", "Pure Black", 2345);
      cars[1] = new Car("Mercedes Benz GTI", "Red", 1099);
      cars[2] = new Car("Ford GT", "Alluminium White", 4543);
      cars[3] = new Car("Mitsubishi Outlander", "Purple", 10000);
      for (Car car : cars) {
        try {
          oosToServer.writeObject(car);
          oosToServer.flush();
          System.out.println("Car sent to the registration server");
          car = registerCar(car);
          System.out.println("The registered car: " + car);
          Thread.sleep(4000);
        } catch (IOException | InterruptedException e) {
          e.printStackTrace();
        }
      }
    } catch (IOException e) {
      e.printStackTrace();
    }
  }
}

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

java.rmi.NotBoundException: CarPlateService
    at java.rmi/sun.rmi.registry.RegistryImpl.lookup(RegistryImpl.java:234)
    at java.rmi/sun.rmi.registry.RegistryImpl_Skel.dispatch(RegistryImpl_Skel.java:133)
    at java.rmi/sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:468)
    at java.rmi/sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:298)
    at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:200)
    at java.rmi/sun.rmi.transport.Transport$1.run(Transport.java:197)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:691)
    at java.rmi/sun.rmi.transport.Transport.serviceCall(Transport.java:196)
    at java.rmi/sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:587)
    at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:828)
    at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$0(TCPTransport.java:705)
    at java.base/java.security.AccessController.doPrivileged(AccessController.java:391)
    at java.rmi/sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:704)
    at java.base/java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1130)
    at java.base/java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:630)
    at java.base/java.lang.Thread.run(Thread.java:832)
    at java.rmi/sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:303)
    at java.rmi/sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:279)
    at java.rmi/sun.rmi.server.UnicastRef.invoke(UnicastRef.java:380)
    at java.rmi/sun.rmi.registry.RegistryImpl_Stub.lookup(RegistryImpl_Stub.java:123)
    at java.rmi/java.rmi.Naming.lookup(Naming.java:101)
    at com.company.CarClient.registerCar(CarClient.java:14)
    at com.company.CarClient.main(CarClient.java:43)

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

Теперь я полностью застрял.

...