Я работаю над одним из школьных заданий для сервера 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)
Я предполагаю, что это могут быть проблемы с доступом, но не знаю, какое решение будет. Я думал скомпилировать весь код и запустить его внутри терминала, но это не помогло.
Теперь я полностью застрял.