-1

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

在此先感谢佩里

4

2 回答 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。

于 2014-10-14T03:38:31.317 回答
-1

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

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

于 2009-11-03T08:57:53.953 回答