我正在尝试实现sun教程rmi应用程序来计算pi。我有一些严重的问题,我找不到解决办法,即使我已经搜索了整个网络和几个熟练的javapeople。我希望你能结束我的沮丧。
疯狂的是,我可以从我的桌面电脑上的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条答案
按热度按时间qlfbtfca1#
您的服务器没有从该客户端接受连接的权限。
因此,您的策略文件不是您所说的位置,或者由于其他原因未加载。
和我一起跑
-Djava.security.debug=access,failure
您将看到发生安全异常时您所在的保护域,以及它拥有哪些权限。nb公司
file:
如果代码库引用本地文件系统,它就不能工作,除非客户机也在同一台机器上,这使得rmi毫无意义。代码库URL需要引用客户端可以访问的位置。您可以使用共享文件系统,但必须提供客户端可用的url。服务器根本不使用自己的代码基url。t40tm48m2#
我也尝试了同样的方法,我发现java只是忽略了策略文件,不管我把它放在哪里,放进了什么,或者我使用了哪个选项让vm获取它。
最后,我创造了我自己的
SecurityManager
在代码中,并手动执行所有操作。