Я начал писать код для клиент-серверной машины на Java, используя RMI (Remote Method Invocation). Код отлично работает на моей машине. Он в основном дает команды клиентскому компьютеру, а клиент обрабатывает эти команды и отвечает соответствующим образом. После выполнения команды машина отправляет обратно свой статус на сервер. Примером может служить то, что сервер запрашивает канал изображения у клиента, а клиент возвращает изображение на сервер.
Я использовал git для клонирования текущего проекта и передачи его на другую машину. Когда я выполняю код на стороне клиента, он работает совершенно нормально, а другая машина (на которую я отправил исходный код) отвечает так, как должна.
Однако, когда я запускаю код на стороне сервера для кодирования на другом компьютере, он дает загадочную ошибку, которая говорит:
C:\Users\RdX\Desktop\Thiswa
javax.naming.NamingException [Root exception is java.rmi.ServerError: Error occurred in server thread; nested exception is:
java.lang.UnsupportedClassVersionError: javadrone/Server (Unsupported major.minor version 51.0)]
at com.sun.jndi.rmi.registry.RegistryContext.rebind(RegistryContext.java:159)
at com.sun.jndi.toolkit.url.GenericURLContext.rebind(GenericURLContext.java:249)
at javax.naming.InitialContext.rebind(InitialContext.java:427)
at javadrone.server.ServerImpl.<init>(ServerImpl.java:46)
at javadrone.server.DroneServer.<init>(DroneServer.java:45)
at javadrone.server.DroneServer.main(DroneServer.java:84)
Caused by: java.rmi.ServerError: Error occurred in server thread; nested exception is:
java.lang.UnsupportedClassVersionError: javadrone/Server (Unsupported major.minor version 51.0)
at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:349)
at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:207)
at sun.rmi.transport.Transport$1.run(Transport.java:148)
at java.security.AccessController.doPrivileged(Native Method)
at sun.rmi.transport.Transport.serviceCall(Transport.java:144)
at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:460)
at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:701)
at java.lang.Thread.run(Thread.java:534)
at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:273)
at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:251)
at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:377)
at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
at com.sun.jndi.rmi.registry.RegistryContext.rebind(RegistryContext.java:157)
...5 more
При проверке трассировки стека код, генерирующий исключение:
package javadrone.server;
import javadrone.Drone;
import javadrone.Server;
import javadrone.command.CommandQueue;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
import java.util.HashMap;
import javax.naming.Context;
import javax.naming.InitialContext;
import javax.naming.NamingException;
public abstract class ServerImpl extends UnicastRemoteObject implements Server {
public static final String RMI_PROT = "rmi:";
private static Context namingContext;
private static HashMap<String, Drone> registeredDrones;
private String name;
public ServerImpl(String name) throws RemoteException, NamingException {
this.name = name;
namingContext = new InitialContext();
namingContext.rebind(RMI_PROT + name, ServerImpl.this);
registeredDrones = new HashMap<>();
}
@Override
public String getName() throws RemoteException {
return name;
}
@Override
public Drone registerDrone(String droneName) throws RemoteException {
System.out.println("Remote client registered...");
DroneImpl d = new DroneImpl(new CommandQueue(), droneName);
registeredDrones.put(droneName, d);
hasRegistered(d);
return d;
}
public Drone getDrone(String droneName) {
return registeredDrones.get(droneName);
}
@Override
public long getTime() throws RemoteException {
return System.currentTimeMillis();
}
public abstract void hasRegistered(DroneImpl d);
}
Чтобы быть точным,
namingContext.rebind(RMI_PROT + name, ServerImpl.this)
- это строка, которая генерирует ошибку.
Я искал много мест, и они говорят, что если компилятор JDK имеет более высокую версию, чем версия JRE, он может выдать такую ошибку.
Однако я удалил все предыдущие JDK и JRE и перекомпилировал код после установки JDK 7.03. Это все еще дает то же исключение.
Почему это происходит и как я могу это исправить?