首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > JAVA > Java Web开发 >

Java rmi 抛出各种错误

2012-12-21 
Java rmi 抛出各种异常JRMITest.java/* * To change this template, choose Tools | Templates * and open

Java rmi 抛出各种异常

JRMITest.java


/*
 * To change this template, choose Tools | Templates
 * and open the template in the editor.
 */
package jrmitest;

import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.PrintStream;
import java.net.MalformedURLException;
import java.rmi.Naming;
import java.rmi.NotBoundException;
import java.rmi.RMISecurityManager;
import java.rmi.RemoteException;
import java.util.logging.Level;
import java.util.logging.Logger;

/**
 *
 * @author lisanhu-v570
 */
public class JRMITest {

    private static final PrintStream out=System.out;
    private static final BufferedReader in=new BufferedReader(new InputStreamReader(System.in));
    
    public static void main(String[] args) {
        System.setSecurityManager(new RMISecurityManager());
        try {
            Test client=(Test)Naming.lookup("rmi://localhost:3333/obj");
            System.out.println(client.getStr());
        } catch (NotBoundException ex) {
            Logger.getLogger(JRMITest.class.getName()).log(Level.SEVERE, null, ex);
        } catch (MalformedURLException ex) {
            Logger.getLogger(JRMITest.class.getName()).log(Level.SEVERE, null, ex);
        } catch (RemoteException ex) {
            Logger.getLogger(JRMITest.class.getName()).log(Level.SEVERE, null, ex);
        }
    }
}



Test.java

package jrmitest;

import java.rmi.Remote;
import java.rmi.RemoteException;


public interface Test extends Remote {
public String getStr() throws RemoteException;
}



TestImpl.java

package jrmitest;

import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;


public class TestImpl extends UnicastRemoteObject implements Test {

public TestImpl() throws RemoteException{

}

public String getStr() throws RemoteException {
return "hello world";
}

}



Server.java

import java.io.PrintStream;
import java.net.MalformedURLException;
import java.rmi.AlreadyBoundException;
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;


public class Server {

private static final PrintStream err=System.err;
private static final int PORT=3333;



public static void main(String[] args) {
try {
TestImpl obj=new TestImpl();
LocateRegistry.createRegistry(PORT);
Naming.bind("rmi://localhost:3333/obj", obj);
System.out.println("Remote object bind success!");
} catch (RemoteException e) {
e.printStackTrace();
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (AlreadyBoundException e) {
e.printStackTrace();
}
}

}



security.policy

grant { 
permission java.security.AllPermission;
};

[最优解释]
问题太复杂了。。
[其他解释]
以上是代码,问题是这样的

如果把所有的文件放在同一个项目中则正常,可以删除security.policy和JRMITest.java中的System.setSecurityManager(new RMISecurityManager());

如果把文件分为两个项目
JRMITest.java Test.java为一组,
Test.java TestImpl.java Server.java为一组,运行报错

如果没有setSecrityManager那句
报:
java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
java.lang.ClassNotFoundException: Test (no security manager: RMI class loader disabled)
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Naming.java:101)
at jrmitest.JRMITest.main(JRMITest.java:30)
Caused by: java.lang.ClassNotFoundException: Test (no security manager: RMI class loader disabled)
at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:554)
at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:646)
at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:311)
at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:257)
at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1549)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1511)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1750)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
... 3 more


如果有了那句,没有security.policy也没有设置安全参数
Exception in thread "main" java.security.AccessControlException: access denied ("java.net.SocketPermission" "127.0.0.1:3333" "connect,resolve")
at java.security.AccessControlContext.checkPermission(AccessControlContext.java:366)
at java.security.AccessController.checkPermission(AccessController.java:560)
at java.lang.SecurityManager.checkPermission(SecurityManager.java:549)
at java.lang.SecurityManager.checkConnect(SecurityManager.java:1051)
at java.net.Socket.connect(Socket.java:574)
at java.net.Socket.connect(Socket.java:528)
at java.net.Socket.<init>(Socket.java:425)
at java.net.Socket.<init>(Socket.java:208)
at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirectSocketFactory.java:40)
at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMasterSocketFactory.java:146)
at sun.rmi.transport.tcp.TCPEndpoint.newSocket(TCPEndpoint.java:613)
at sun.rmi.transport.tcp.TCPChannel.createConnection(TCPChannel.java:216)
at sun.rmi.transport.tcp.TCPChannel.newConnection(TCPChannel.java:202)
at sun.rmi.server.UnicastRef.newCall(UnicastRef.java:340)


at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Naming.java:101)
at jrmitest.JRMITest.main(JRMITest.java:30)
Java Result: 1

如果设置了security.policy后
java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
java.lang.ClassNotFoundException: Test
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Naming.java:101)
at jrmitest.JRMITest.main(JRMITest.java:30)
Caused by: java.lang.ClassNotFoundException: Test
at java.net.URLClassLoader$1.run(URLClassLoader.java:366)
at java.net.URLClassLoader$1.run(URLClassLoader.java:355)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:354)
at java.lang.ClassLoader.loadClass(ClassLoader.java:423)
at java.lang.ClassLoader.loadClass(ClassLoader.java:356)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:264)
at sun.rmi.server.LoaderHandler.loadProxyInterfaces(LoaderHandler.java:730)
at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:674)
at sun.rmi.server.LoaderHandler.loadProxyClass(LoaderHandler.java:611)
at java.rmi.server.RMIClassLoader$2.loadProxyClass(RMIClassLoader.java:646)
at java.rmi.server.RMIClassLoader.loadProxyClass(RMIClassLoader.java:311)
at sun.rmi.server.MarshalInputStream.resolveProxyClass(MarshalInputStream.java:257)
at java.io.ObjectInputStream.readProxyDesc(ObjectInputStream.java:1549)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1511)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1750)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1347)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:369)
... 3 more


以上异常均由客户端报出

请问应该如何解决


[其他解释]
自己顶一下自己顶一下
[其他解释]
问题解决

解决方案:把项目从netbeans中迁出到eclipse中
………………

热点排行