2014-03-25 46 views
0

我似乎無法得到此工作。我只是看一下實驗室的基本說明,但我根本沒有使用RMI的經驗。我似乎無法弄清爲什麼我會收到錯誤。RMI - Unmarshalled異常

服務器

public static void runServer() { 
     // Install security manager, if none is present 
     if (System.getSecurityManager() == null) { 
      System.setSecurityManager(new SecurityManager()); 
     } 
     try { 
      Registry registry = LocateRegistry.getRegistry(); 
      System.out.println("Reg: " + registry.toString()); 
      String name = "Server"; 
      Server server = new Server(); 
      I_Server stub = (I_Server) UnicastRemoteObject.exportObject(server, 0); 

      registry.rebind(name, stub); 
      System.out.println("All is well :-)\n"); 
     } catch (RemoteException re) { 
      System.err.println("Remote Exception in DisplayGetEngine.main()\n"); 
      re.printStackTrace(); 
     } 
    } 

} 

我在NetBeans

參數以下運行命令和參數:-cp C:\ RMI \服務器\ SRC; C:\ RMI \服務器\ DIST \服務器。罐子-Djava.rmi.server.codebase =文件:/ C:/rmi/Server/dist/Server.jar

工作目錄:C:\ RMI \服務器

我的堆棧跟蹤是,在重新綁定方法。

Reg: RegistryImpl_Stub[UnicastRef [liveRef: [endpoint:[10.50.18.205:1099](remote),objID:[0:0:0, 0]]]] 
Remote Exception in DisplayGetEngine.main() 

java.rmi.ServerException: RemoteException occurred in server thread; nested exception is: 
    java.rmi.UnmarshalException: error unmarshalling arguments; nested exception is: 
    java.lang.ClassNotFoundException: server.I_Server 
    at sun.rmi.server.UnicastServerRef.oldDispatch(UnicastServerRef.java:419) 
    at sun.rmi.server.UnicastServerRef.dispatch(UnicastServerRef.java:267) 
    at sun.rmi.transport.Transport$1.run(Transport.java:177) 
    at sun.rmi.transport.Transport$1.run(Transport.java:174) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at sun.rmi.transport.Transport.serviceCall(Transport.java:173) 
    at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:553) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(TCPTransport.java:808) 
    at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(TCPTransport.java:667) 
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145) 
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615) 
    at java.lang.Thread.run(Thread.java:724) 
    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 server.Server.runServer(Server.java:50) 
    at server.Server.main(Server.java:31) 

如果我不跑rmiregistry的,這是我的堆棧跟蹤

在DisplayGetEngine.main

遠程異常()

java.rmi.ConnectException: Connection refused to host: 10.50.18.205; nested exception is: 
    java.net.ConnectException: Connection refused: connect 
    at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:619) 
    at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216) 
    at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202) 
    at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:340) 
    at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source) 
    at server.Server.runServer(Server.java:50) 
    at server.Server.main(Server.java:31) 

回答

0

嘗試調用createRegistry()首先要確保你有一個運行註冊表中。此外,端口0應該是一個保留端口,因此您將無法使您的服務器在該特定端口上偵聽。試試默認的一個1099.

+0

這有些幫助!我得到一個java.rmi.NoSuchObjectException:現在在表異常中沒有這樣的對象! –

+0

看看[this](http://osdir.com/ml/java.sun.rmi/2005-09/msg00005.html)文章。好像你遇到了這個錯誤。你可以試着在''''''''''''''''''''''''''''''''''''''''''''''''''''''''''get' Naming.rebind()''''。 – lukas

0

運行中沒有問題rmiregistry。如果仔細查看堆棧跟蹤,問題似乎是ClassNotFoundException,而參數正在rmi註冊表中解組。您需要檢查RMI服務器的代碼庫,無論server.I_Server類是否存在於Server.jar中,而是在類路徑中運行該類。

從RMI常見問題

A.4爲什麼我會得到一個ClassNotFoundException? 很可能在導出遠程對象的虛擬機上沒有設置(或未正確設置)java.rmi.server.codebase屬性。請參閱我們的教程,Dynamic code downloading使用Java RMI(使用java.rmi.server.codebase屬性)。

+0

參數正在註冊表中而非RMI服務器中編組。 (註冊表是另一個RMI服務器。) – EJP

0

該問題出現在構建文件中。我需要插入這個聲明。

<target name="startRMI" depends="init"> 
<exec executable="C:\Program\Files\Java\jdk1.7.0_51\jre\bin\rmiregistry" 
dir="${build.classes.dir}"></exec> 
</target>