线程“main”java.rmi.NotBoundException中的异常

时间:2013-12-02 02:17:32

标签: java rmi

我有问题,当我运行我的rmi服务器时,我得到一个异常的非绑定异常 甚至我导出远程对象并将其绑定到注册表  这是我的远程接口代码

 import java.rmi.Remote;
    public interface fact extends Remote {
    public int factory(int a);
    } 

这里是界面实现

public class factimport implements fact {

    @Override
    public int factory(int a) {
        int mult=1;
        for (int i=1;i<=a;i++)
            mult=mult*i;
        return mult;
    }

}

和服务器代码

import java.net.MalformedURLException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;
import java.rmi.server.UnicastRemoteObject;


public class Server extends UnicastRemoteObject {
/**
     * 
     */
    private static final long serialVersionUID = 1L;

protected Server() throws RemoteException {
        super();

    }

public static void main() throws RemoteException, MalformedURLException{
    factimport fi=new factimport();
    Registry reg=LocateRegistry.createRegistry(1099);
    reg.rebind("factobject", exportObject(fi));
    System.out.println("server started");
}
}

和客户

import java.net.MalformedURLException;
import java.rmi.NotBoundException;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.registry.Registry;


public class Client {

    /**
     * @param args
     * @throws NotBoundException 
     * @throws RemoteException 
     * @throws MalformedURLException 
     */
    public static void main(String[] args) throws MalformedURLException, RemoteException, NotBoundException {
        // TODO Auto-generated method stub
        Registry reg=LocateRegistry.getRegistry("127.0.0.1",1099);
    factimport x=(factimport)reg.lookup("factobject");
    System.out.println(x.factory(5));

}
}

2 个答案:

答案 0 :(得分:3)

  1. 除非您在同一主机上运行服务器和客户端,这使得RMI毫无意义,否则需要修改客户端中的getRegistry()调用以指向服务器主机,而不是客户端主持人(本身)。

  2. 必须声明您的远程方法在远程接口中抛出RemoteException

  3. 除非您在远程接口上运行了rmic,否则您将无法检测到(2),您需要将exportObject()调用更改为{{ 1}}由于exportObject(fi, 0),

  4. 的Javadoc序言中解释的原因
  5. 您的UnicastRemoteObject.方法没有正确的签名,因此无法执行。它应该是Server.main()

  6. 您应该将服务器中的public static void main(String[] args) ...变量设置为静态,以防止它被垃圾回收。

  7. 在您的客户端中,Registry reg类型的变量应为factimport类型,您应将查找结果转换为fact

  8. 如果fact.实际上是在一台机器上以此状态运行此代码的结果,那么它只能意味着您在启动服务器时忽略了运行时异常。

答案 1 :(得分:-2)

你的代码有点不正统。我不知道这是否会有所帮助,但可能会有所帮助。

通常,远程对象实现将扩展UnicastRemoteObject。所以,你有这个factimport类:

public class factimport implements fact extends UnicastRemoteObject {

    @Override
    public int factory(int a) {
        int mult=1;
        for (int i=1;i<=a;i++)
            mult=mult*i;
        return mult;
    }

}

服务器类:

public class Server {
/**
     * 
     */
    private static final long serialVersionUID = 1L;

protected Server() throws RemoteException {
        super();

    }

public static void main() throws RemoteException, MalformedURLException{
    factimport fi=new factimport();
    Registry reg=LocateRegistry.createRegistry(1099);
    reg.rebind("factobject", fi);
    System.out.println("server started");
}
}

我希望这会奏效。