-1

Pi を計算する Sun Tutorials RMI アプリケーションを実装しようとしています。私はいくつかの深刻な問題を抱えており、Web 全体と数人の Java スキルのある人々を検索してきましたが、解決策を見つけることができません。あなたが私の欲求不満を終わらせることができることを願っています。

クレイジーなことは、デスクトップ コンピューターの 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

同じことを試してみたところ、ポリシーファイルをどこに置いても、何を入れても、VMにそれを取得させるために使用したオプションに関係なく、Javaは単にポリシーファイルを無視することがわかりました。

最後にSecurityManager、コードで独自のものを作成し、すべてを手動で行いました。

于 2009-11-03T08:57:53.953 に答える