2015-06-01 1 views
0

Я пытаюсь написать код RMI в первый раз. Программа выполняет очень простую функцию получения даты с сервера. Я каким-то образом удалось получить сервер работает, однако на стороне клиента исключения встречаются:Rmi getDate() Программа дает ошибку на стороне клиента

Exception in thread "main" java.rmi.NotBoundException: //localhost/RemoteDatum 
    at sun.rmi.registry.RegistryImpl.lookup(RegistryImpl.java:166) 
    at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source) 
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:410) 
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:268) 
    at sun.rmi.transport.Transport$1.run(Transport.java:200) 
    at sun.rmi.transport.Transport$1.run(Transport.java:197) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.Transport.serviceCall(Transport.java:196) 
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:568) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:826) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.lambda$run$254(TCPTransport.java:683) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler$$Lambda$1/1287360293.run(Unknown Source) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:682) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617) 
    at java.lang.Thread.run(Thread.java:745) 
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:276) 
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:253) 
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:379) 
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source) 
    at MyClient.main(MyClient.java:15) 

Мой интерфейс «RemoteDatum» выглядит следующим образом: (я скопировал интерфейс в сервере в папке клиента Project и окурки были порождены затмение плагин RMI)

import java.rmi.Remote; 
    import java.rmi.RemoteException; 
    import java.util.Date; 


    public interface RemoteDatum extends Remote{ 
     public Date holeDatum() throws RemoteException; //holeDatum means getDate in german 
    } 

RemoteDatumImpl: Реализация интерфейса

import java.rmi.RemoteException; 
     import java.rmi.server.UnicastRemoteObject; 
     import java.util.Date; 

     public class RemoteDatumImpl extends UnicastRemoteObject implements RemoteDatum { 


     protected RemoteDatumImpl() throws RemoteException { 
       super(); 
      } 


     public Date holeDatum() throws RemoteException 
      { 
       return new Date(); 
      } 
     } 

сервер:

import java.net.MalformedURLException; 
    import java.rmi.Naming; 
    import java.rmi.Remote; 
    import java.rmi.RemoteException; 
    import java.rmi.registry.LocateRegistry; 
    import java.rmi.registry.Registry; 
    import java.rmi.server.UnicastRemoteObject; 


    public class MyServer extends UnicastRemoteObject { 

     protected MyServer() throws RemoteException { 
      super(); 
     } 


     public static void main(String[] args) throws RemoteException, MalformedURLException 
     { 
      try 
      { 
       String name = "RemoteDatum"; 
       Registry r = LocateRegistry.getRegistry(); 
       MyServer service = new MyServer(); 
       r.rebind(name, service);  
      }catch(Exception ex){ex.printStackTrace();} 
     } 
    } 

Мой клиент:

import java.net.MalformedURLException; 
    import java.rmi.NotBoundException; 
    import java.rmi.RemoteException; 
    import java.rmi.registry.LocateRegistry; 
    import java.rmi.registry.Registry; 


    public class MyClient { 


     public static void main(String[] args) throws RemoteException, MalformedURLException, NotBoundException 
     {  
       Registry r = LocateRegistry.getRegistry(); 
       String name = "//localhost/RemoteDatum"; 
       RemoteDatum service = (RemoteDatum) r.lookup(name); 
       System.out.println(service.holeDatum()); 

     } 

    } 

Я использую Eclipse, RMI плагин для запуска RMI реестра и не знаю, если это уместно. Я использую Mac.

ответ

0

Первое:

Registry r = LocateRegistry.getRegistry(); 

Если клиент работает на том же хосте, что и сервер, вы должны получить сервера Registry, не свои:

Registry r = LocateRegistry.getRegistry("serverhost); 

Тогда:

String name = "//localhost/RemoteDatum"; 
RemoteDatum service = (RemoteDatum) r.lookup(name); 

Если вы используете интерфейс Registry, вы не должны включать имя хоста в строка поиска. Это должно быть только "RemoteDatum".

В качестве альтернативы,, если Вы используете Naming класс, вы должны включать имя хоста:

RemoteDatum service = (RemoteDatum)Naming.lookup("//serverhost/RemoteDatum"); 
+0

Спасибо за ваше предложение. я попробовал это немного, это все еще не работает. Я получаю эту ошибку "неизвестный хост" – user4962486