2009-11-03 166 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。