1

私が書いている小さなJavaRMIサーバーとクライアントプログラムがあります。私は成功せずにエラーメッセージを理解しようとしばらく時間を費やしました。

クライアントは次のエラーを生成します。

接続しようとしています:127.0.0.1:3232エラー!!!:StockClient:main:サーバーに接続できませんでした:java.rmi.UnmarshalException:リターンヘッダーのマーシャリング解除中にエラーが発生しました。ネストされた例外は次のとおりです。java.rmi.UnmarshalException:リターンヘッダーのマーシャリング解除中にエラーが発生しました。ネストされた例外は次のとおりです。java.io.EOFExceptionjava.io.EOFExceptionatsun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:209)at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:359)at sun .rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)at StockClient.StockClient.main(StockClient.java:44)原因:java.io.EOFException at java.io.DataInputStream.readByte(DataInputStream.java:250)at sun .rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:195)...3つ以上

サーバーでは、クライアントが接続しようとしたときにのみ次のエラーが発生します。

this address = localhost / 127.0.0.1、port=3232スレッド"RMITCP Connection(idle)"の例外java.security.AccessControlException:java.securityでアクセスが拒否されました(java.net.SocketPermission 127.0.0.1:62586 accept、resolve) .AccessControlContext.checkPermission(AccessControlContext.java:374)at java.security.AccessController.checkPermission(AccessController.java:549)at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)at java.lang.SecurityManager.checkAccept( SecurityManager.java:1157)at sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.checkAcceptPermission(TCPTransport.java:636)at sun.rmi.transport.tcp.TCPTransport.checkAcceptPermission(TCPTransport.java:275)at sun.rmi .transport.Transport $ 1.run(Transport.java:158)atjava.security.AccessController。doPrivileged(ネイティブメソッド)at sun.rmi.transport.Transport.serviceCall(Transport.java:155)at sun.rmi.transport.tcp.TCPTransport.handleMessages(TCPTransport.java:535)atsun.rmi.transport.tcp。 TCPTransport $ ConnectionHandler.run0(TCPTransport.java:790)at sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run(TCPTransport.java:649)at java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java: 886)at java.util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:908)at java.lang.Thread.run(Thread.java:680)run0(TCPTransport.java:790)at sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run(TCPTransport.java:649)at java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:886)at java .util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:908)at java.lang.Thread.run(Thread.java:680)run0(TCPTransport.java:790)at sun.rmi.transport.tcp.TCPTransport $ ConnectionHandler.run(TCPTransport.java:649)at java.util.concurrent.ThreadPoolExecutor $ Worker.runTask(ThreadPoolExecutor.java:886)at java .util.concurrent.ThreadPoolExecutor $ Worker.run(ThreadPoolExecutor.java:908)at java.lang.Thread.run(Thread.java:680)

サーバーエラーのため、セキュリティエラーまたはレジストリエラーであると確信しています。サーバーのセキュリティポリシーは次のとおりです。

{パーミッションjava.security.AllPermission;を付与します。};

次の引数で実行されている

-Djava.security.policy = client.policy

私は見つけることができるすべてを試しましたが、輪になって回り続けているようです。

関連する方法:

サーバ:

 public static void main(String[] args)
    {//main(...) starts
        // set up the data structures and data

        //add users
        //Users hard coded as this is an example proof on concept program
        //Names and passwords not hashed for simplicity
        User alpha = new User("Alpha", "AlphaPass");
        User omega = new User("Omega", "OmegaPass");
        users.add(alpha);
        users.add(omega);

        //startup the RMI server
        try
        {
            System.setSecurityManager(new RMISecurityManager());
            StockServer server = new StockServer();
            StockServerInterface inter = (StockServerInterface)
UnicastRemoteObject.exportObject (server,0);

            // create the registry and bind the name and object.
            registry = LocateRegistry.createRegistry(thisPort);
            registry.rebind("StockServer", inter);
        }
        catch (Exception e)
        {
            System.out.println("Unable to create StockServer: " + e);
            e.printStackTrace();
            System.exit(1);
        }
    }//main(...) ends


    /**
     * Constructor for StockServer
     *
     * @throws RemoteException
     */
    public StockServer() throws RemoteException
    {

        //try to get the host machine's IP address
        try
        {
            // get the address of this host.
            thisAddress = (InetAddress.getLocalHost()).toString();
        } catch (Exception e)
        {
            throw new RemoteException("can't get inet address. " + e);
        }

        //Set the port
        thisPort = 3232;

        //Print out the server address and port
        System.out.println("this address=" + thisAddress + ",port=" + thisPort);
    }

クライアント:

private static StockServerInterface stockServer;
static public void main(String args[])
{
    Registry registry;
    //get the server address from the args
    String serverAddress = args[0];

    //get the server port from the args
    String serverPort = args[1];

    //Let the user know we are about to try to connect
    System.out.println("Trying to connect to: " + serverAddress + ":" + serverPort);
    try
    {
        // get the registry
        registry = LocateRegistry.getRegistry(
                serverAddress,
                (new Integer(serverPort)).intValue());
        // look up the remote object
        stockServer = (StockServerInterface) (registry.lookup("StockServer"));


        //Authenticate the user
        authenticate();

        //setup the hashset
        HashSet<Stock> hashStockSet = null;

        //setup the hashset of desired stocks
        try
        {
            hashStockSet = getHashSet();
        } catch (IOException e)
        {
            e.printStackTrace();
            System.exit(1);
        } catch (ClassNotFoundException e)
        {
            e.printStackTrace();
            System.exit(1);
        }
        //bit of a heavy handed infinte loop so we continue to get the loop
        while(true)
        {
            //Run the ticker
            ticker(hashStockSet);
        }

        // call the remote method


    }
    catch (RemoteException e)
    {
        System.out.println("ERROR!!!: StockClient: main: Could not connect to the server: "+e);
        e.printStackTrace();
    }
    catch (NotBoundException e)
    {
        System.out.println("ERROR!!!: StockClient: main: Could not connect to the server: "+e);
        e.printStackTrace();
    }
4

1 に答える 1

6

SecurityManagerクライアントがサーバーにクラスを提供するためにコードベース機能に依存していない限り、RMIサーバーには必要ありません。削除するか、.policyファイルをデバッグしてください。明らかに、あなたが書いたものはロードされていません。

でサーバーを実行すると-Djava.security.debug=access,failure、すべてのセキュリティドメインが構成を取得している場所と、例外がスローされた時点で失敗しているドメインが表示されます。

于 2012-10-28T04:14:35.710 に答える