请教一个RMI原理问题RMI分为3部分,客户端,服务器端,RMIRegistery我们不妨就借用网上的一个简单例子来说明问题这是远程对象
import java.rmi.*;public interface Compute extends Remote{
public double add(double a,double b) throws RemoteException;
}
两点要求1,继承标记接口Remote。identify interfaces whose methods may be invoked from a non-local virtual machine.标识该接口可以被非本地VM调用呗。2,里面每个方法都要抛出RemoteException
业务接口的实现类,也就是做实事的类import java.rmi.server.*;
import java.rmi.*;public class ComputeImpl extends UnicastRemoteObject implements Compute
{
//要在构造方法抛出异常
public ComputeImpl() throws RemoteException{}
public double add(double a,double b){
return a+b;
}
}编写一个Serverimport java.rmi.*;public class Server
{ public static void main(String[] args) throws Exception
{
ComputeImpl c = new ComputeImpl();
Naming.bind("rmi://localhost:8888/compute",c);//compute别名
}}
客户端import java.rmi.*;public class Client
{
public static void main(String[] args) throws Exception
{
Compute c = (Compute)Naming.lookup("rmi://localhost:8888/compute");//rmiregistry首先响应
//实际c是Stub对象
System.out.println(c.getClass());
System.out.println(c.add(12.3,34));
}
}
最后还要
rmiregistry 8888
现在的问题是。按照资料的描述
客户端,服务器端,RMIRegistery分别属于不同的JVM
那么这3部分就可以运行在3台不同的机器上
但是请注意,假设现在是运行在不同机器上
服务器端上的这段代码就很可疑拉
public class Server
{ public static void main(String[] args) throws Exception
{
ComputeImpl c = new ComputeImpl();
Naming.bind("rmi://localhost:8888/compute",c);//compute别名
}}因为这是调用RMIRegistery提供的服务来进行注册但是RMIRegistery所在的机器上不一定有ComputeImpl 这个类哦,更不要说c这个ComputeImpl 对象拉
这又怎么做绑定呢??
我看到的范例代码都是本地做绑定
Naming.bind("rmi://localhost:8888/compute",c);//compute别名
即运行RMIRegistery与服务器端在同一台机器,这当然能够找到远程接口,远程对象啊那么是否意味RMIRegistery与服务器端必须运行在同一机器上呢??请大虾指教
import java.rmi.*;public interface Compute extends Remote{
public double add(double a,double b) throws RemoteException;
}
两点要求1,继承标记接口Remote。identify interfaces whose methods may be invoked from a non-local virtual machine.标识该接口可以被非本地VM调用呗。2,里面每个方法都要抛出RemoteException
业务接口的实现类,也就是做实事的类import java.rmi.server.*;
import java.rmi.*;public class ComputeImpl extends UnicastRemoteObject implements Compute
{
//要在构造方法抛出异常
public ComputeImpl() throws RemoteException{}
public double add(double a,double b){
return a+b;
}
}编写一个Serverimport java.rmi.*;public class Server
{ public static void main(String[] args) throws Exception
{
ComputeImpl c = new ComputeImpl();
Naming.bind("rmi://localhost:8888/compute",c);//compute别名
}}
客户端import java.rmi.*;public class Client
{
public static void main(String[] args) throws Exception
{
Compute c = (Compute)Naming.lookup("rmi://localhost:8888/compute");//rmiregistry首先响应
//实际c是Stub对象
System.out.println(c.getClass());
System.out.println(c.add(12.3,34));
}
}
最后还要
rmiregistry 8888
现在的问题是。按照资料的描述
客户端,服务器端,RMIRegistery分别属于不同的JVM
那么这3部分就可以运行在3台不同的机器上
但是请注意,假设现在是运行在不同机器上
服务器端上的这段代码就很可疑拉
public class Server
{ public static void main(String[] args) throws Exception
{
ComputeImpl c = new ComputeImpl();
Naming.bind("rmi://localhost:8888/compute",c);//compute别名
}}因为这是调用RMIRegistery提供的服务来进行注册但是RMIRegistery所在的机器上不一定有ComputeImpl 这个类哦,更不要说c这个ComputeImpl 对象拉
这又怎么做绑定呢??
我看到的范例代码都是本地做绑定
Naming.bind("rmi://localhost:8888/compute",c);//compute别名
即运行RMIRegistery与服务器端在同一台机器,这当然能够找到远程接口,远程对象啊那么是否意味RMIRegistery与服务器端必须运行在同一机器上呢??请大虾指教
也许你可以通过别的方法从另一台机器上得到c,然后绑定
另外,绑定的时候用localhost在客户端解析为本机地址
RMIregistery 是一个注册服务器,他启动于一个PC,
当在SERVER调用Naming.bind("rmi://localhost:8888/compute",c);
注册时候他连接到注册服务器,注册c远程对象
这时, 只要RMIregistery不关闭,
就可以在CLIENT中 Compute c = (Compute)Naming.lookup("rmi://localhost:8888/compute");
得到远程对象。不知我理解的对不对。
那么这就意味着RMIregistery 必须与server端在同一机器上
我晕了
RMIregistery 必须于server端的类在一个目录下执行
如果这样
为什么有大虾会说
RMIregistery 可以与server端不在同一机器上
请大虾指教啊