2009-11-03 147 views
0

我試圖實施Sun教程RMI應用程序來計算Pi。我遇到了一些嚴重的問題,我無法找到解決方案事件,儘管我一直在搜索整個網絡和幾名熟練的人員。 我希望你能結束我的挫折。Java RMI(服務器:TCP連接空閒/客戶端:Unmarshalexception(EOFException))

瘋狂的事情是我可以從我的臺式機上的cmd運行應用程序。在筆記本電腦上完全相同的目錄中使用完全相同的代碼嘗試完全相同的操作會產生以下錯誤。當我嘗試將客戶端連接到服務器時發生此問題。

我不相信這個錯誤是由於我的策略文件,因爲我可以在桌面上運行它。它必須在其他地方。有沒有人嘗試過,你能給我一個暗示我的問題在哪裏嗎?


POLICYFILE SERVER: 
grant 
{ 
    permission java.security.AllPermissions; 
    permission java.net.SocketPermission"*", "connect, resolve"; 
}; 

POLICYFILE CLIENT: 
grant 
{ 
    permission java.security.AllPermissions; 
    permission java.net.SocketPermission"*", "connect, resolve"; 

}; 
______________________________________________ 

SERVERSIDE ERRORS: 
Microsoft Windows XP [Version 5.1.2600] 
(C) Copyright 1985-2001 Microsoft Corp. 

C:\Documents and Settings\STUDENT>cd\ 

C:\>start rmiregistry 

C:\>java -cp c:\java;c:\java\compute.jar -Djava.rmi.server.codebase=file:/c:/jav 
a/compute.jar -Djava.rmi.server.hostname=localhost -Djava.security.policy=c:/jav 
a/servertest.policy engine.ComputeEngine 
ComputeEngine bound 

Exception in thread "RMI TCP Connection(idle)" java.security.AccessControlExcept 
ion: access denied (java.net.SocketPermission 127.0.0.1:1440 accept,resolve) 
     at java.security.AccessControlContext.checkPermission(Unknown Source) 
     at java.security.AccessController.checkPermission(Unknown Source) 
     at java.lang.SecurityManager.checkPermission(Unknown Source) 
     at java.lang.SecurityManager.checkAccept(Unknown Source) 
     at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.checkAcceptPermi 
ssion(Unknown Source) 
     at sun.rmi.transport.tcp.TCPTransport.checkAcceptPermission(Unknown Sour 
ce) 
     at sun.rmi.transport.Transport$1.run(Unknown Source) 
     at java.security.AccessController.doPrivileged(Native Method) 
     at sun.rmi.transport.Transport.serviceCall(Unknown Source) 
     at sun.rmi.transport.tcp.TCPTransport.handleMessages(Unknown Source) 
     at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run0(Unknown Sou 
rce) 
     at sun.rmi.transport.tcp.TCPTransport$ConnectionHandler.run(Unknown Sour 
ce) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.runTask(Unknown Source 
) 
     at java.util.concurrent.ThreadPoolExecutor$Worker.run(Unknown Source) 
     at java.lang.Thread.run(Unknown Source) 

_______________________________ 
CLIENTSIDE ERRORS: 
Microsoft Windows XP [Version 5.1.2600] 
(C) Copyright 1985-2001 Microsoft Corp. 

C:\Documents and Settings\STUDENT>cd\ 

C:\>java -cp c:\java;c:\java\compute.jar -Djava.rmi.server.codebase=file:\C:\jav 
a\files\ -Djava.security.policy=c:/java/clienttest.policy client.ComputePi local 
host 45 

ComputePi exception: 
java.rmi.UnmarshalException: Error unmarshaling return header; nested exception 
is: 
     java.io.EOFException 
     at sun.rmi.transport.StreamRemoteCall.executeCall(Unknown Source) 
     at sun.rmi.server.UnicastRef.invoke(Unknown Source) 
     at java.rmi.server.RemoteObjectInvocationHandler.invokeRemoteMethod(Unkn 
own Source) 
     at java.rmi.server.RemoteObjectInvocationHandler.invoke(Unknown Source) 
     at $Proxy0.executeTask(Unknown Source) 
     at client.ComputePi.main(ComputePi.java:18) 
Caused by: java.io.EOFException 
     at java.io.DataInputStream.readByte(Unknown Source) 
     ... 6 more 

C:\> 

在此先感謝 佩裏

+1

這個問題似乎是脫離主題,因爲它是自我封閉,請參閱答案。 – EJP 2013-10-05 10:05:30

回答

0

我嘗試了和我一樣發現的Java根本無視政策文件,無論身在何處,我把它還是我把它付諸表決或我曾經讓VM選擇它的選項。

最後,我在代碼中創建了自己的SecurityManager,並手動完成了所有操作。

+1

這隻意味着你沒有把它放在正確的地方或正確指定它的位置。請注意,它是相對或絕對URL,而不是路徑,因此您必須使用/ not \。 – EJP 2013-02-03 03:18:44

0

您的服務器沒有權限接受來自該客戶端的連接。

Ergo您的政策文件不是您說的那樣,或者因爲某些其他原因而未加載。

使用-Djava.security.debug=access,failure運行它,您將看到在發生安全異常時您處於什麼保護域以及它具有的權限。如果它指的是一個本地文件系統,除非客戶端也是在同一臺機器,這使得RMI相當無意義

java -cp c:\java;c:\java\compute.jar -Djava.rmi.server.codebase=file:/c:/java/compute.jar -Djava.rmi.server.hostname=localhost -Djava.security.policy=c:/java/servertest.policy engine.ComputeEngine 

NB一個file:代碼庫不能工作。代碼庫URL需要引用客戶端可以訪問的位置。您可以使用共享文件系統,但必須提供客戶端可用的URL。服務器完全不使用自己的代碼庫URL。

相關問題