java.rmi.ServerException: Възникна RemoteException в нишката на сървъра; ClassNotFoundException

Когато стартирам моя сървърен код през eclipse, получих следното изключение:

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: com.RMIInterface
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:413)
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267)
    at sun.rmi.transport.Transport$1.run(Transport.java:177)

Стартирах регистъра на RMI, като просто написах "start rmiregistry" в cmd ред. Отвори се нов прозорец със заглавие "c:\Program Files\Java\jdk1.7.0\bin\rmiregistry.exe". В този път само аз имам JDK.

Всички мои .class файлове са налични в този път: D:\Workspace\Study\bin\com.

В папката com имам и трите файла "RMIInterface, RMIServer, RMIClient".

Когато стартирам сървърния код от eclipse, получих гореспоменато изключение. (т.е.) RMIInterface не е намерен. Но го имам в същата папка.

Какво друго трябва да направя, за да стартирам сървъра?

Това е моят сървърен код:

RMIServer serRef = new RMIServer();
try {
    RMIInterface inref = (RMIInterface)UnicastRemoteObject.exportObject(serRef, 0);
    Registry reg = LocateRegistry.getRegistry();
    reg.bind("ServerObj", inref); -------->Exception in this line
} catch (AlreadyBoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
    }

person Karthik    schedule 26.09.2012    source източник
comment
имате ли .class файлове и на трите в една и съща папка?   -  person gprathour    schedule 26.09.2012
comment
Получавате ли това при експорт? обвързване? търсене в клиента? или извикване на отдалечения метод в клиента?   -  person user207421    schedule 26.09.2012
comment
Всичките ми .class файлове са в една и съща папка. Получавам тази грешка, когато се опитвам да стартирам кода на сървъра. Искам да кажа, че искам да стартирам сървъра. Това правилен начин ли е да стартирате RMI сървъра чрез eclipse?   -  person Karthik    schedule 26.09.2012
comment
Реших окончателно.Registry reg = LocateRegistry.getRegistry(); създаде проблема. Вместо това, LocateRegistry.createRegistry() ми помогна   -  person Karthik    schedule 26.09.2012


Отговори (2)


Мисля, че проблемът е в начина, по който осъществявате достъп до вашия интерфейс.

Както казахте, Under the com folder I have all three files "RMIInterface, RMIServer,RMIClient".

Ако имате всички файлове в един и същи пакет/папка, тогава защо пишете com.RMIInterface

трябва просто да бъде RMIInterface, защото начинът, по който го споменахте, ще търси друг пакет, наречен com в текущия ви пакет com.

Надявам се, че ме разбрахте.

Редактиране

Докато изпълняваме RMI програми, трябва да имаме работещ rmiregistry.

Трябва да стартирате rmiregistry преди да стартирате сървърната програма.

Опитайте да го стартирате от конзолата или CMD в windows.

Опитайте rmiregistry или start rmiregistry в CMD. Докато работим от CMD, трябва да стартираме rmiregistry от същата папка/пакет, от който изпълняваме javac и java. В случай на eclipse предполагам, че трябва да опитате да стартирате rmiregistry от вашата папка com.

Актуализация

Мисля, че досега се опитвате да стартирате rmiregistry от вътрешната папка com. Просто се опитайте да го стартирате от вашата com папка.

въпреки D:\Workspace\Study\bin\com>start rmiregistry

опитвам

D:\Workspace\Study\bin\start rmiregistry

person gprathour    schedule 26.09.2012
comment
com.RMIInterface е пълното име на класа. Тук няма доказателства, че той изобщо „пише“ това и ако го е направил, няма да е грешно. Гласувай против. - person user207421; 26.09.2012
comment
Но не използвах com.RMIInterface. Просто използвах само RMIInterface. - person Karthik; 26.09.2012
comment
@GPS Стартирах rmiregistry преди да стартирам сървъра. В cmd подканата навигирам по пътя до моята папка com и стартирах rmiregistry. прозорецът на регистъра се отвори. След това само стартирах сървърната си програма... - person Karthik; 26.09.2012
comment
Можете ли да опитате да стартирате програмата в CMD? Като стартиране на rmiregistry в cmd и след това стартиране на вашия сървър и клиентски програми от cmd? - person gprathour; 26.09.2012
comment
@GPS Когато се опитам да стартирам от CMD, стартирам сървъра, мига. Имам предвид прозорец, отворен и затворен незабавно. Същото се случи и когато стартирах клиентската програма. Няма резултат. Добавих моята сървърна програма във въпроса... - person Karthik; 26.09.2012
comment
@Karthik В това мисля, че вашият rmiregistry не започва правилно. Защото, ако изпълнявате командата start rmiregistry, тя трябва да стартира нова cmd конзола и трябва да остане там, освен ако не я затворите. - person gprathour; 26.09.2012
comment
@GPS Съжалявам, че питам повече. Но както казахте, стартира нова cmd конзола. Вярвам, че това е rmiregistry. грешно ли е Можете ли да предложите правилния начин да започнете? - person Karthik; 26.09.2012

Remote Server Error:RemoteException occurred in server thread; nested exception is:
java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is:
java.lang.ClassNotFoundException: mathInterface

Грешката е много лесна за отстраняване, като се изпълнят следните стъпки:

  • Например вашият java файл счита D диск
  • Стартирайте rmiregistry D устройство (пример D:\start rmiregistry) след това не стартирайте rmiregistry на другите устройства, това ще доведе до горната грешка

(Където и да е вашият файл, започнете rmiregistry)

справка: java.rmi.ServerException: Възникна RemoteException в сървърна нишка (ClassNotFoundException)

person Chris Sim    schedule 03.09.2013