我对远程方法调用期间的调用顺序有很多疑问。 以下是我读过的4个无错误的代码片段,用于理解 RMI。
1。)接口
import java.rmi.*;
public interface AddServerIntf extends Remote {
double add(double d1, double d2) throws RemoteException;
}
2.。实施
import java.rmi.*;
import java.rmi.server.*;
public class AddServerImpl extends UnicastRemoteObject implements AddServerIntf {
public AddServerImpl() throws RemoteException {} // what is it meant for ?
public double add(double d1 , double d2) throws RemoteException {
return d1 + d2;
}
}
3.)AddServer Class
import java.net.*;
import java.rmi.*;
public class AddServer {
public static void main(String args[]) {
try {
AddServerImpl addServerImpl = new AddServerImpl();
Naming.rebind("AddServer",addServerImpl); // what does it do and how ?
} catch(Exception exc) {
System.out.println("Exception : " + exc);
}
}
}
4.)AddClient Class
import java.rmi.*;
public class AddClient {
public static void main(String args[]) {
try {
String addServerURL = "rmi://" + args[0] + "/AddServer";
AddServerIntf addServerIntf = (AddServerIntf)Naming.lookup(addServerURL); // how does it look up and how does it return ?
System.out.println("The first number is : " + args[1]);
double d1 = Double.valueOf(args[1]).doubleValue();
System.out.println("The second number is : " + args[2]);
double d2 = Double.valueOf(args[2]).doubleValue();
System.out.println("The sum is : " + addServerIntf.add(d1,d2)); // what does it mean to call the method of an interface ?
} catch(Exception exc) {
System.out.println(exc);
}
}
}
服务器计算机上的文件:AddServer.class,AddServerImpl.class,AddServerImpl_Stub.class,AddServerIntf.class
客户端计算机上的文件:AddServerIntf.class,AddClient.class,AddServerImpl_Stub.class
将上述文件保存在各自的位置后,我在服务器计算机上启动 rmiregistry ,然后使用java AddServer
启动服务器,然后使用java 127.0.0.1 20 30
启动客户端
客户端启动代码(AddServerIntf)Naming.lookup(addServerURL);
中的语句AddClient
后会做什么?
客户端程序开始执行时执行的例程是什么?它如何归还总和?
语句Naming.rebind("AddServer",addServerImpl);
在课程AddServer
中的作用是什么?
最后当我打电话使用addServerIntf.add(d1,d2)
获取总和时,它是什么意思(调用接口的方法)?为什么我要调用接口的方法?那是做什么的?
我无法理解RMI的机制,谁叫谁以及如何?。
答案 0 :(得分:-2)
RMI:远程方法调用。
通常当我们说我调用一个方法时,我们隐式地假设一个类的方法在与调用类相同的JVM中加载。 RMI允许你做同样的事情,但调用方法和被调用者在不同的JVM中(通常在两个不同的物理机器上)。
在典型的RMI中有两部分:
在逐一回答您的问题之前,以下是典型的客户端服务器通信的发生方式(高级别)。
服务器启动
AddServerImpl
)对象注册到其注册表。客户端调用远程方法
(AddServerIntf)Naming.lookup(addServerURL)
)addServerIntf.add(d1,d2))
)(d1,d2)
),将它们作为请求传递给服务器。AddServerImpl
)上执行该方法。 return d1 + d2
)由方法返回,服务器序列化输出并将其作为响应发送给调用客户端让我回答你的问题
代码(AddServerIntf)Naming.lookup(addServerURL);
中的AddClient
语句是什么?
- 这是对服务器的请求,以提供对我们打算调用其方法的对象的远程引用。
声明是什么Naming.rebind("AddServer",addServerImpl)
;在AddServer类中做什么?
- 这是为了确保服务器知道(在其注册表中添加)有一个名为" AddServer"的对象。因此,只要有请求调用此对象的方法,就可以提供它。
当我调用使用addServerIntf.add(d1,d2)获取总和时,它是什么意思(调用接口的方法)?为什么我要调用接口的方法?那会是什么呢?
- 接口是实现抽象的java机制。现在,当您调用接口时,会调用实现相同接口的对象的方法(在本例中为远程服务器上的对象)。为了回答“为什么”,抽象可以帮助您将使用和实施分开。因此调用者不需要知道implementation()的细节,它只应该只关心输入和输出参数。
回答你剩下的问题
客户端程序开始执行时执行的例程是什么?它如何归还总和?
- 目前为止,请参阅this link。它以比我更好的方式解释了:)。