2012-05-25 45 views
0

我有這個奇怪的問題。 我正在嘗試使用RMI編寫一個簡單的Hello World java程序。 這裏是我的文件,都屬於同一個包:Java RMI簡單Hello World程序拋出RemoteException

Hello.java:

package com.something; 
import java.rmi.Remote; 
import java.rmi.RemoteException; 

public interface Hello extends Remote{ 
    String hello() throws RemoteException; 
} 

Server.java

package com.something; 
import com.something.Hello; 
import java.rmi.RemoteException; 
import java.rmi.registry.LocateRegistry; 
import java.rmi.registry.Registry; 
import java.rmi.server.UnicastRemoteObject; 

public class Server implements Hello{ 

    @Override 
    public String hello() throws RemoteException { 
     return "hello world!!!!"; 
    } 
public static void main (String args[]) throws RemoteException{ 

     //System.setProperty("java.rmi.server.hostname", "10.0.0.5"); 
       if (System.getSecurityManager() == null) { 
         System.setSecurityManager(new SecurityManager()); 
        } 
        try { 
         String name = "Hello"; 
         Hello s = new Server(); 
         Hello stub = 
          (Hello) UnicastRemoteObject.exportObject(s, 0); 
         Registry registry = LocateRegistry.getRegistry(8888); 



         registry.rebind(name, stub); 
         System.out.println("Hello bound"); 
        } catch (Exception e) { 
         System.err.println("Hello exception:"); 
         e.printStackTrace(); 
        } 
    }   

}  

Client.java:

package com.something; 


import java.rmi.registry.LocateRegistry; 
import java.rmi.registry.Registry; 



public class Client { 
    public static void main(String args[]) { 
     if (System.getSecurityManager() == null) { 
      System.setSecurityManager(new SecurityManager()); 
     } 
     try { 
      String name = "Hello"; 
      Registry registry = LocateRegistry.getRegistry("localhost"); 

      Hello h = (Hello) registry.lookup(name); 
      System.out.println(h.hello()); 
     } catch (Exception e) { 
      System.err.println("My exception:"); 
      e.printStackTrace(); 
     } 
    }  
} 

之前runnig的代碼,在終端,我運行:

rmiregistry 8888 

我運行下面的標誌Java代碼: -Djava.security.policy = /用戶/ nataliazon /文件/工作區/ SiecioweRMI/src目錄/的server.policy

,這裏是我的server.policy文件:

grant { 
    permission java.security.AllPermission; 
}; 

當我運行這樣的服務器程序,下面的異常被拋出:

Hello exception: 
java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: com.something.Hello 
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:400) 
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:248) 
    at sun.rmi.transport.Transport$1.run(Transport.java:159) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.Transport.serviceCall(Transport.java:155) 
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:680) 
    at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(StreamRemoteCall.java:255) 
    at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:233) 
    at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:359) 
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source) 
    at com.something.Server.main(Server.java:30) 
Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: com.something.Hello 
    at sun.rmi.registry.RegistryImpl_Skel.dispatch(Unknown Source) 
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:390) 
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:248) 
    at sun.rmi.transport.Transport$1.run(Transport.java:159) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.Transport.serviceCall(Transport.java:155) 
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:790) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:649) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(ThreadPoolExecutor.java:886) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:908) 
    at java.lang.Thread.run(Thread.java:680) 
Caused by: java.lang.ClassNotFoundException: com.something.Hello 
    at java.net.URLClassLoader$1.run(URLClassLoader.java:202) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at java.net.URLClassLoader.findClass(URLClassLoader.java:190) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:306) 
    at java.lang.ClassLoader.loadClass(ClassLoader.java:247) 
    at java.lang.Class.forName0(Native Method) 
    at java.lang.Class.forName(Class.java:247) 
    at sun.rmi.server.LoaderHandler.loadProxyInterfaces(LoaderHandler.java:709) 
    at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:653) 
    at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:590) 
    at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:628) 
    at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:294) 
    at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:238) 
    at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1530) 
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1492) 
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731) 
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328) 
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350) 
    ... 12 more 

和客戶端程序會拋出:

My exception: 
java.rmi.ConnectException: Connection refused to host: localhost; nested exception is: 
    java.net.ConnectException: Connection refused 
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:601) 
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198) 
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184) 
    at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322) 
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source) 
    at com.something.Client.main(Client.java:18) 
Caused by: java.net.ConnectException: Connection refused 
    at java.net.PlainSocketImpl.socketConnect(Native Method) 
    at java.net.PlainSocketImpl.doConnect(PlainSocketImpl.java:351) 
    at java.net.PlainSocketImpl.connectToAddress(PlainSocketImpl.java:213) 
    at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:200) 
    at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:432) 
    at java.net.Socket.connect(Socket.java:529) 
    at java.net.Socket.connect(Socket.java:478) 
    at java.net.Socket.<init>(Socket.java:375) 
    at java.net.Socket.<init>(Socket.java:189) 
    at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22) 
    at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128) 
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595) 
    ... 5 more 

這個問題怎麼解決?

+0

請按照本教程來實現http://docs.oracle.com/javase/1.3/docs/guide/rmi/getstart.doc.html – Saurabh

+0

謝謝,我會嘗試使用您給我的鏈接。 (以前我使用過這個:http://docs.oracle.com/javase/tutorial/rmi/overview.html) –

+0

'Server'不需要擴展UnicastRemoteObject.'他正在調用'UnicastRemoteObject.exportObject( )'。這就夠了。沒有答案。 Downvote。 – EJP

回答

3

拋出java.lang.ClassNotFoundException:com.something.Hello

註冊表和客戶端不會對他們的類路徑類。

在註冊表中,最簡單的解決方案是在服務器JVM中啓動它。通過LocateRegistry.createRegistry():或者以這樣的方式啓動它,即類在其類路徑上;有幾種方法可以實現這一點。

java.rmi.ConnectException:拒絕連接主機:本地主機

通過指定「本地主機」,而不是在服務器主機的主叫Naming.lookup()時或調用Registry.lookup()之前調用LocateRegistry.getRegistry()時引起的。註冊表並不是無處不在,它位於服務器主機上。

注意,您不需要SecurityManager,除非您使用RMI代碼庫功能或者您有其他一些要求。

+0

感謝您的回答,它終於有效! –

+0

@NataliaZoń如果你找到它,你應該考慮對它進行升級或標記爲正確。 – EJP

相關問題