小弟请教一下RMI的问题
源程序如下:接口类
package rmi;
import java.rmi.*;
public interface imrinterface extends Remote {
    public String DBModify(String string) throws RemoteException;
}接口实现类
package rmi;
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
public class rmiinterfaceimp  extends UnicastRemoteObject implements imrinterface
{
    public rmiinterfaceimp(String name) throws RemoteException
    {
        super();
        try
        { if (java.rmi.Naming.lookup(name) == null)
            Naming.bind(name, this);
        else
            Naming.rebind(name, this);
            
        }
        catch (Exception e)
        {
            if (e instanceof RemoteException)
            {
                throw (RemoteException) e;
            }
            else
            {
                throw new RemoteException(e.getMessage());
            }        }
}    public String DBModify(String string)
    {
    String temp=string;
    temp.concat("ppppppppp");
    return temp;
    }    }客户端
package rmi;
import java.rmi.*;public class rmiclient {
    public void RMIClient()
     {
            try {
                 String serverName = "localhost";
                //指定安全策略文件
                System.setProperty("java.security.policy",
                                   "file:./src/rmi/dbRMI.policy");                //设置系统安全接口
                if (System.getSecurityManager() == null) {
                    System.setSecurityManager(new RMISecurityManager());
                }
            imrinterface temp;
            temp = (imrinterface) Naming.lookup(
                    "//" + serverName + ":1200/DBConnection");            String kao=temp.DBModify("dasdsadsadsadasdasdasdsadas");            System.out.println(kao);
            }
                catch(Exception ee)
                {
                }    }}服务器端package rmi;
import java.rmi.*;
import java.rmi.registry.*;public class rmiServer {
    public static void main(String[] args) throws Exception {
         //指定安全策略文件
         System.setProperty("java.security.policy",
                            "file:./src/rmi/dbRMI.policy");         if (System.getSecurityManager() == null) {
             System.setSecurityManager(new RMISecurityManager());
         }         //启动rmiregistry
         LocateRegistry.createRegistry(1200);
         rmiinterfaceimp dbInterfaceImp = new rmiinterfaceimp("DBConnection");
         System.out.println("Ready.....");
     }}可是运行服务器时出错
E:\Borland\JBuilder2005\jdk1.4\bin\javaw -classpath "E:\Documents and Settings\66\jbproject\rmi2\classes;E:\Borland\JBuilder2005\jdk1.4\bin\JBuilder2005_c.jar;E:\Borland\JBuilder2005\jdk1.4\jre\bin\JBuilder2005_c.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\im\indicim.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\im\thaiim.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\ext\dnsns.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\ext\sunjce_provider.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\ext\ldapsec.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\ext\localedata.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\jsse.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\plugin.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\sunrsasign.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\charsets.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\rt.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\jce.jar;E:\Borland\JBuilder2005\jdk1.4\jre\javaws\javaws.jar;E:\Borland\JBuilder2005\jdk1.4\lib\tools.jar;E:\Borland\JBuilder2005\jdk1.4\lib\dt.jar;E:\Borland\JBuilder2005\jdk1.4\lib\htmlconverter.jar"  rmi.rmiServer 
java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
java.lang.ClassNotFoundException: rmi.DBInterfaceImp_Stub
at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
at java.rmi.Naming.lookup(Naming.java:84)
at rmi.rmiinterfaceimp.<init>(rmiinterfaceimp.java:22)
at rmi.rmiServer.main(rmiServer.java:28)
Caused by: java.lang.ClassNotFoundException: rmi.DBInterfaceImp_Stub
at java.net.URLClassLoader$1.run(URLClassLoader.java:199)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
at java.lang.Class.forName0(Native Method)
at java.lang.Class.forName(Class.java:219)
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:430)
at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165)
at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:631)
at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:257)
at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:200)
at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1513)
at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1435)
at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1626)
at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
... 4 more
Exception in thread "main" 求救的啊

解决方案 »

  1.   

    只有stub的
    我的用的是Jbuilder2005
      

  2.   

    rmiinterfaceimp_Skel
    rmiinterfaceimp_Stub
    都已经产生了
    可还是一样的错误的
    E:\Borland\JBuilder2005\jdk1.4\bin\javaw -classpath "E:\Documents and Settings\66\jbproject\rmi2\classes;E:\Borland\JBuilder2005\jdk1.4\bin\JBuilder2005_c.jar;E:\Borland\JBuilder2005\jdk1.4\jre\bin\JBuilder2005_c.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\im\indicim.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\im\thaiim.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\ext\dnsns.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\ext\sunjce_provider.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\ext\ldapsec.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\ext\localedata.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\jsse.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\plugin.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\sunrsasign.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\charsets.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\rt.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\jce.jar;E:\Borland\JBuilder2005\jdk1.4\jre\javaws\javaws.jar;E:\Borland\JBuilder2005\jdk1.4\lib\tools.jar;E:\Borland\JBuilder2005\jdk1.4\lib\dt.jar;E:\Borland\JBuilder2005\jdk1.4\lib\htmlconverter.jar"  rmi.rmiServer 
    java.rmi.UnmarshalException: error unmarshalling return; nested exception is: 
    java.lang.ClassNotFoundException: rmi.DBInterfaceImp_Stub
    at sun.rmi.registry.RegistryImpl_Stub.lookup(Unknown Source)
    at java.rmi.Naming.lookup(Naming.java:84)
    at rmi.rmiinterfaceimp.<init>(rmiinterfaceimp.java:22)
    at rmi.rmiServer.main(rmiServer.java:28)
    Caused by: java.lang.ClassNotFoundException: rmi.DBInterfaceImp_Stub
    at java.net.URLClassLoader$1.run(URLClassLoader.java:199)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:187)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:289)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:235)
    at java.lang.ClassLoader.loadClassInternal(ClassLoader.java:302)
    at java.lang.Class.forName0(Native Method)
    at java.lang.Class.forName(Class.java:219)
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:430)
    at sun.rmi.server.LoaderHandler.loadClass(LoaderHandler.java:165)
    at java.rmi.server.RMIClassLoader$2.loadClass(RMIClassLoader.java:631)
    at java.rmi.server.RMIClassLoader.loadClass(RMIClassLoader.java:257)
    at sun.rmi.server.MarshalInputStream.resolveClass(MarshalInputStream.java:200)
    at java.io.ObjectInputStream.readNonProxyDesc(ObjectInputStream.java:1513)
    at java.io.ObjectInputStream.readClassDesc(ObjectInputStream.java:1435)
    at java.io.ObjectInputStream.readOrdinaryObject(ObjectInputStream.java:1626)
    at java.io.ObjectInputStream.readObject0(ObjectInputStream.java:1274)
    at java.io.ObjectInputStream.readObject(ObjectInputStream.java:324)
    ... 4 more
    Exception in thread "main"
      

  3.   

    rmi.DBInterfaceImp_Stub 看看是否存在这个class
      

  4.   

    是否開啟RMI服務?WINDOWS下
    start rmiregistryhoho!
      

  5.   

    E:\Borland\JBuilder2005\jdk1.4\bin\javaw -classpath "E:\Documents and Settings\66\jbproject\RMI\classes;E:\Borland\JBuilder2005\thirdparty\junit3.8\junit.jar;E:\Borland\JBuilder2005\lib\unittest.jar;E:\Borland\JBuilder2005\jdk1.4\bin\JBuilder2005_c.jar;E:\Borland\JBuilder2005\jdk1.4\jre\bin\JBuilder2005_c.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\im\indicim.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\im\thaiim.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\ext\dnsns.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\ext\sunjce_provider.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\ext\ldapsec.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\ext\localedata.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\jsse.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\plugin.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\sunrsasign.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\charsets.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\rt.jar;E:\Borland\JBuilder2005\jdk1.4\jre\lib\jce.jar;E:\Borland\JBuilder2005\jdk1.4\jre\javaws\javaws.jar;E:\Borland\JBuilder2005\jdk1.4\lib\tools.jar;E:\Borland\JBuilder2005\jdk1.4\lib\dt.jar;E:\Borland\JBuilder2005\jdk1.4\lib\htmlconverter.jar"  Rmiserver 
    java.rmi.RemoteException: access denied (java.net.SocketPermission 127.0.0.1:1099 connect,resolve)
    at Rmientity.<init>(Rmientity.java:35)
    at Rmiserver.main(Rmiserver.java:28)
    Exception in thread "main" 
    还出现这样的问题
      

  6.   

    我用的是Jbuilder的
    在程序里面打开的了啊
    //启动rmiregistry
             LocateRegistry.createRegistry(1200);
      

  7.   

    在你的jdk_home\jre\lib\security\java.policy文件中加入一下一行:
      permission java.net.SocketPermission "*:1024-65535", "accept,connect,listen,resolve";或者你单独写一个policy文件,命名为xx.policy
    然后添加运行参数:
    java -Djava.security.policy=xx.policy  classname
    在jbuilder中添加运行参数java -Djava.security.policy=policy
      

  8.   

    我在E:\Documents and Settings\66\jbproject\RMI\src
    的目录下面有了一个dbRMI.policy的文件
    grant {
    permission java.net.SocketPermission "*:1024-65535", "accept,connect,listen,resolve";
            permission java.io.FilePermission "<<ALL FILES>>", "read,write";
    };
      

  9.   

    package  不要用rmi,换个其他的名字try
      

  10.   

    上述异常為PERMISSION异常,請參照PearLoverQ(66)的結果.俺太長時間不用,忘記了.
      

  11.   

    原因是客户端调用远程对象的方法时客户端会与服务器端通信,服务器端将远程对象的存根rmi.DBInterfaceImp_Stub的实例序列化后发送给客户端(注意序列化之后的东东仅包括一些实例的状态数据,并不包括DBInterfaceImp_Stub类本身的结构信息),客户端接收到序列化后的数据之后,会在当前环境中寻找rmi.DBInterfaceImp_Stub这个类反序列化成实例驻留客户端内存中。客户端如果没有找到存根类rmi.DBInterfaceImp_Stub,则会抛出ClassNotFoundException。请确认:
    1.是否使用rmic生成了远程对象的存根类
    2.在启动客户端的时候,是否将存根类的位置放在classpath中,以便客户端运行的时候能找到此类
    3.如果没有将存根类的位置放在classpath中,可以使用动态类加载技术。你是否采用了动态类加载。
      

  12.   

    luckycat(潘鑫) 
    麻烦,小弟初次使用JAVA
    可否说的更详细一些
    谢谢了
      

  13.   

    把你的邮箱发个消息给我,给你发一份我自己写的模拟rmi的框架,看懂了你基本上就理解了RMI的框架了。
      

  14.   

    luckycat(潘鑫) 你好,我也在学习rmi你能给我也发一份吗[email protected]谢谢!