我有问题,当我运行我的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));
}
}
答案 0 :(得分:3)
除非您在同一主机上运行服务器和客户端,这使得RMI毫无意义,否则需要修改客户端中的getRegistry()
调用以指向服务器主机,而不是客户端主持人(本身)。
必须声明您的远程方法在远程接口中抛出RemoteException
。
除非您在远程接口上运行了rmic
,否则您将无法检测到(2),您需要将exportObject()
调用更改为{{ 1}}由于exportObject(fi, 0),
您的UnicastRemoteObject.
方法没有正确的签名,因此无法执行。它应该是Server.main()
您应该将服务器中的public static void main(String[] args) ...
变量设置为静态,以防止它被垃圾回收。
在您的客户端中,Registry reg
类型的变量应为factimport
类型,您应将查找结果转换为fact
如果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");
}
}
我希望这会奏效。