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

问题描述 投票:-1回答:2

我正在尝试实现计算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:\>

在此先感谢佩里

java security rmi unmarshalling accesscontrolexception
2个回答
0
投票

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

你的政策文件不在你说的地方,或者由于其他原因没有加载。

使用-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
投票

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

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

© www.soinside.com 2019 - 2024. All rights reserved.