3

そのため、RMI チュートリアルで問題を抱えている他の人からの回答を探すのにかなりの時間を費やしましたが、これには完全に困惑しています。私は日食を通してこのチュートリアルをやっています。

私の ComputeEngine クラス。これはチュートリアルからコピーしただけなので、問題はないと思います。

import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;
import compute.Compute;
import compute.Task;

public class ComputeEngine implements Compute {

    public ComputeEngine() {
        super();
    }

    public <T> T executeTask(Task<T> t) {
        return t.execute();
    }

    public static void main(String[] args) {
        if (System.getSecurityManager() == null) {
            System.setSecurityManager(new RMISecurityManager());
        }
        try {
            String name = "Compute";
            Compute engine = new ComputeEngine();
            Compute stub = (Compute) UnicastRemoteObject.exportObject(engine, 0);
            Registry registry = LocateRegistry.getRegistry();
            registry.rebind(name, stub);
            System.out.println("ComputeEngine bound");
        } catch (Exception e) {
            System.err.println("ComputeEngine exception:");
            e.printStackTrace();
        }
    }
}

コマンドラインでrmiregistryを開始します

set classpath=
start rmiregistry

Eclipse の VM 引数は次のとおりです。

-Djava.rmi.server.codebase=file:/C:/Users/Kevin/workspace/RMI/bin/
-Djava.rmi.server.hostname=Compute
-Djava.security.policy=server.policy

bin フォルダーに compute.jar ファイルと server.policy ファイルがあります。ポリシー ファイルにすべての権限を付与しました。

grant{
    permission java.security.AllPermission;
};

その後、ComputeEngine を実行すると、次のエラーが表示されます。

ComputeEngine exception:
java.security.AccessControlException: access denied (java.net.SocketPermission          127.0.0.1:1099 connect,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.checkConnect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at java.net.Socket.<init>(Unknown Source)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(Unknown Source)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(Unknown Source)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.createConnection(Unknown Source)
at sun.rmi.transport.tcp.TCPChannel.newConnection(Unknown Source)
at sun.rmi.server.UnicastRef.newCall(Unknown Source)
at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
at engine.ComputeEngine.main(ComputeEngine.java:31)

再バインドに何らかの問題があるようですが、何がわかりません。ポリシーファイルがある場合、AccessControlException もわかりません。rmir​​egistry がまだ実行中であることを確認し、起動後に表示される空のウィンドウを閉じません。

そうそう、私は迷っています。

4

2 に答える 2

1

セキュリティ ポリシー ファイルが見つからないことは明らかです。プログラムを実行するときは、現在の作業ディレクトリにある必要があります。-Djava.security.debug=access,failure を指定してプログラムを実行し、何が起こっているかを正確に確認してください。

于 2012-04-21T08:48:56.997 に答える
-1

例外は、コードベースにネットワーク通信用のソケット/を作成する権限がないことを明確に示しています。その理由は、セキュリティ ポリシーの仕様だけにある可能性があります。ポリシー ファイルを明示的に指定せず、JVM がデフォルトのセキュリティ ポリシーを使用できるようにします。デフォルトのポリシーでは適切なアクセス許可が指定されているため、問題はありません。

于 2012-04-21T06:00:12.053 に答える