Java RMI(服务器:TCP连接空闲/客户端:Unmarshalexception(EOFException))

时间:2009-11-03 08:45:49

标签: java security rmi unmarshalling accesscontrolexception

我正在尝试实现计算Pi的Sun Tutorials RMI应用程序。我遇到了一些严重的问题而且我找不到解决方案,尽管我一直在搜索整个网络和几个javaskilled人员。 我希望你能结束我的挫折。

疯狂的是我可以从桌面计算机上的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:\>

提前致谢 佩里

2 个答案:

答案 0 :(得分:0)

您的服务器无权接受该客户端的连接。

Ergo 您的政策文件不在您说的位置,或者因其他原因未加载。

使用-Djava.security.debug=access,failure运行它,您将看到在发生安全性异常时您所处的保护域以及它具有的权限。

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

注意如果file:代码库引用本地文件系统,它就无法工作,除非客户端也在同一台机器上,这使得RMI毫无意义。代码库URL需要引用客户端可访问的位置。您可以使用共享文件系统,但必须提供客户端可用的URL。服务器根本不使用自己的代码库URL。

答案 1 :(得分:-1)

我尝试了同样的操作,我发现Java只是忽略了策略文件,无论我把它放在哪里,或者我放入了什么,或者我用它来使VM选择它。

最后,我在代码中创建了自己的SecurityManager并手动完成了所有操作。