学习RMI,程序中有System.setSecurityManager(new RMISecurityManager());这样的代码,所以我设置了policy文件,文件的内容为:
grant {
permission java.security.AllPermission;
};然后我在命令行下运行程序:
E:\test\rmi\server>java -Djava.security.policy=RMIpolicy.policy;-Djava.rmi.server.codebase=file:/.\/ UpperImpl
Exception in thread "main" java.security.AccessControlException: access denied (java.net.SocketPermission 127.0.0.1:1099
 connect,resolve)
        at java.security.AccessControlContext.checkPermission(AccessControlContext.java:374)
        at java.security.AccessController.checkPermission(AccessController.java:546)
        at java.lang.SecurityManager.checkPermission(SecurityManager.java:532)
        at java.lang.SecurityManager.checkConnect(SecurityManager.java:1034)
        at java.net.Socket.connect(Socket.java:524)
        at java.net.Socket.connect(Socket.java:478)
        at java.net.Socket.<init>(Socket.java:375)
        at java.net.Socket.<init>(Socket.java:189)
        at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:22)
        at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:128)
        at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:595)
        at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:198)
        at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:184)
        at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:322)
        at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
        at java.rmi.Naming.rebind(Naming.java:160)
        at UpperImpl.main(UpperImpl.java:17)因为权限问题报错,我估计是我的policy文件的问题,所以我特意在policy文件里加了一些杂乱的字母,然后再执行,还是报上面的错。肯定是policy文件的问题了。为什么policy文件会无效? -d参数是按;还是空格隔开?我用空格不行 希望有人能帮忙解释下

解决方案 »

  1.   

    file:/.\/ UpperImplfile协议的路径看着不像这样用绝对路径试试?
      

  2.   

    这个问题解决了是用空格分隔的 然后写绝对路径 然而出新的问题:UpperImpl_Stub.class是在服务器端的,在目录/server下
    我执行E:\test\rmi\client>java -Djava.security.policy=RMIpolicy.policy UpperClient
    出现如下错误:
    java.rmi.UnmarshalException: error unmarshalling return; nested exception is:
            java.lang.ClassNotFoundException: UpperImpl_Stub
            at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
            at java.rmi.Naming.lookup(Naming.java:84)
            at UpperClient.main(UpperClient.java:17)
    Caused by: java.lang.ClassNotFoundException: UpperImpl_Stub
            at java.net.URLClassLoader$1.run(URLClassLoader.java:202)
            at java.security.AccessController.doPrivileged(Native Method)
            at java.net.URLClassLoader.findClass(URLClassLoader.java:190)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:306)
            at java.lang.ClassLoader.loadClass(ClassLoader.java:247)
            at java.lang.Class.forName0(Native Method)
            at java.lang.Class.forName(Class.java:247)
            at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:434)
            at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165)
            at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:620)
            at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:247)
            at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:197)
            at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1574)
            at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1495)
            at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1731)
            at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1328)
            at java.io.ObjectInputStream.readObject(ObjectInputStream.java:350)
            ... 3 more难道要把UpperImpl_Stub.class拷贝到/client下吗?如果那样还是远程调用吗?不知道这个该怎么解决