RMI程序是否只能运行在服务器,请老手指点一下。

解决方案 »

  1.   

    RMI client端从RMI server端获得stub对象...不明白你的问题.
      

  2.   

    我编写了一个简单的RMI程序,报如下错误:
    java.security.AccessControlException: access denied (java.net.SocketPermission 1
    27.0.0.1:1099 connect,resolve)
            at java.security.AccessControlContext.checkPermission(AccessControlConte
    xt.java:270)
            at java.security.AccessController.checkPermission(AccessController.java:
    401)
            at java.lang.SecurityManager.checkPermission(SecurityManager.java:542)
            at java.lang.SecurityManager.checkConnect(SecurityManager.java:1044)
            at java.net.Socket.connect(Socket.java:428)
            at java.net.Socket.connect(Socket.java:384)
            at java.net.Socket.<init>(Socket.java:291)
            at java.net.Socket.<init>(Socket.java:119)
            at sun.rmi.transport.proxy.RMIDirectSocketFactory.createSocket(RMIDirect
    SocketFactory.java:22)
            at sun.rmi.transport.proxy.RMIMasterSocketFactory.createSocket(RMIMaster
    SocketFactory.java:128)
    等等......程序摘自Java编程思想,如下:
    import java.rmi.*;
    import java.rmi.server.*;
    import java.rmi.registry.*;
    import java.net.*;interface PerfectTimeI extends Remote
    {
      long getPerfectTime() throws RemoteException;
    } ///:~
    public class PerfectTime implements PerfectTimeI
    {
       // Implementation of the interface:
      public long getPerfectTime() throws RemoteException
      {
        return System.currentTimeMillis();
      }  public PerfectTime() throws RemoteException
      {
    //      super(); // Called automatically
      }
       // Registration for RMI serving:
      public static void main(String[] args)
      {
        System.setSecurityManager(new RMISecurityManager());
        try
        {
          LocateRegistry.createRegistry(2006);
          PerfectTime pt = new PerfectTime();
          Naming.bind("////jjbobo:1099//PerfectTime", pt);   //jjbobo是我的主机名
          System.out.println("Ready to do time");
        }
        catch(Exception e)
        {
    System.out.println("ERROR");
          e.printStackTrace();
        }
      }
    } ///:~我的机器系统是win2000
      

  3.   

    System.setSecurityManager(new RMISecurityManager());这句去掉,否则要建策略文件
      

  4.   

    去掉后报下面的异常:
    HelloImpl.main: an exception occured:
    java.rmi.ServerException: Server RemoteException; nested exception is:
            java.rmi.UnmarshalException: error unmarshalling arguments; nested excep
    tion is:
            java.lang.ClassNotFoundException: hello.HelloImpl_Stub
            at sun.rmi.transport.StreamRemoteCall.exceptionReceivedFromServer(Stream
    RemoteCall.java:247)
            at sun.rmi.transport.StreamRemoteCall.executeCall(StreamRemoteCall.java:
    223)
            at sun.rmi.server.UnicastRef.invoke(UnicastRef.java:350)
            at sun.rmi.registry.RegistryImpl_Stub.rebind(Unknown Source)
            at java.rmi.Naming.rebind(Naming.java:160)
            at hello.HelloImpl.main(HelloImpl.java:27)
    Caused by: java.rmi.UnmarshalException: error unmarshalling arguments; nested ex
    ception is:
            java.lang.ClassNotFoundException: hello.HelloImpl_Stub
    Caused by: java.lang.ClassNotFoundException: hello.HelloImpl_Stub这是怎么回事啊?
      

  5.   

    是不是hello.HelloImpl_Stub类找不到,可我的类明明有啊,我用java执行时,也已经把它的相关位置设进了-classpath中了。
      

  6.   

    rmiregistry -Jjava.rmi.codebase=某个url
      

  7.   

    这个“某个URL”,到底应该怎样设置啊
    是本机的IP,还是其他什么啊
      

  8.   

    哦,我查了一下,rmiregistry -Jjava.rmi.codebase=安全管理配置文件.
    我运行服务端时,是这样的:java -Djava.security.policy=my.policy hello.HelloImpl
    不行啊
      

  9.   

    java.rmi.StubNotFoundException: Stub class not found: testrmi.RemoteObject_Stub; nested exception is: 
    java.lang.ClassNotFoundException: testrmi.RemoteObject_Stub
    at sun.rmi.server.RemoteProxy.getStub(RemoteProxy.java:98)
    at sun.rmi.server.RemoteProxy.getStub(RemoteProxy.java:55)
    at sun.rmi.server.UnicastServerRef.setSkeleton(UnicastServerRef.java:179)
    at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:142)
    at sun.rmi.server.UnicastServerRef.exportObject(UnicastServerRef.java:129)
    at java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:275)
    at java.rmi.server.UnicastRemoteObject.exportObject(UnicastRemoteObject.java:178)
    at java.rmi.server.UnicastRemoteObject.<init>(UnicastRemoteObject.java:75)
    at java.rmi.server.UnicastRemoteObject.<init>(UnicastRemoteObject.java:61)
    at testrmi.RemoteObject.<init>(RemoteObject.java:14)
    at testrmi.RemoteObject.main(RemoteObject.java:30)
    Caused by: java.lang.ClassNotFoundException: testrmi.RemoteObject_Stub
    at java.net.URLClassLoader$1.run(URLClassLoader.java:198)
    at java.security.AccessController.doPrivileged(Native Method)
    at java.net.URLClassLoader.findClass(URLClassLoader.java:186)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:299)
    at sun.misc.Launcher$AppClassLoader.loadClass(Launcher.java:265)
    at java.lang.ClassLoader.loadClass(ClassLoader.java:255)
    at sun.rmi.server.RemoteProxy.loadClassFromClass(RemoteProxy.java:191)
    at sun.rmi.server.RemoteProxy.getStub(RemoteProxy.java:93)
    ... 10 more
    我也出现这样的问题,急待高手解决啊
      

  10.   

    to sunshineforsun(一米阳光)同病相怜啊,如果你解快了,千万要再帮帮我啊
      

  11.   

    如果找不到相关类文件, 最好把文件放在运行的相关目录中, 而不是每个都去配置classpath
      

  12.   

    我放了,我的源程序在g:\hello\hello下,执行rmic时我的当前位置是g:\hello,我把桩类放在g:\hello里和g:\hello\hello里各一份,还有那个安全文件也是。
      

  13.   

    rmiregistry -Jjava.rmi.codebase=某个url
    我前天看错了,这个不是哪个安全文件,但这个URL要怎样设置.我是这样设的:
    rmiregistry -Jjava.rmi.codebase=g:/hello/hello
    因为我的桩类在g:/hello/hello里面。
    报告如下错误:
    Error loading class java/rmi/codebase=g:/hello/hello: Bad major version number我分别这样试了试:
    rmiregistry -Jjava.rmi.codebase=g:/hello
    rmiregistry -Jjava.rmi.codebase=g:/hello/
    rmiregistry -Jjava.rmi.codebase=g:/hello/hello/
    rmiregistry -Jjava.rmi.codebase=file://g:/hello
    rmiregistry -Jjava.rmi.codebase=file://g:/hello/hello
    rmiregistry -Jjava.rmi.codebase=file://g:/hello/
    rmiregistry -Jjava.rmi.codebase=file://g:/hello/hello/
    都不行,报一样的错误。
      

  14.   

    to vage(秋叶纷纷)
    你会了把代码发给我啊,这个问题困扰我好长时间了
      

  15.   

    to sunshineforsun(一米阳光)放心,如果我整出来了,一定把代码和如何设置给你。我查了查网上的资料,好像是要让rmiregistry能够找到stub,skeleton,如何设置还不清楚。也希望高手指点一下。
      

  16.   

    用rimic编译后,产生stub和skel类,客户端只要有stub类和对应接口类就可以了,server端要有stub,skel和接口实现类。服务端要启动rmiregistry,不要关闭这个进程,然后客户端就可以调用了