Java 关于RMI的程序结果
我有两个问题 结果将显示如下 11 11 11 12358 12358Java 关于RMI的程序结果,java,rmi,Java,Rmi,我有两个问题 结果将显示如下 11 11 11 12358 12358 为什么前三个结果相同 为什么第四个可以使用远程实现对象工作 代码如下: FibClient.java package fib; import java.rmi.Naming; import java.io.*; public class FibClient { public static void main(String args[]) { try { int numFib
package fib;
import java.rmi.Naming;
import java.io.*;
public class FibClient {
public static void main(String args[]) {
try {
int numFibNum;
String registryURL = "rmi://localhost:1099/fib";
FibInterface h1 = (FibInterface)Naming.lookup(registryURL);
numFibNum = 5;
Fib c = new Fib();
//numFibNum = Integer.parseInt(args[0]);
for (int i=0; i<numFibNum; i++) {
h1.getNextFibNum(c);
System.out.print(h1.getNextFibNum(new Fib())+" ");
}
System.out.println();
for (int i=0; i<numFibNum; i++) {
System.out.print(h1.getNextFibNum(h1.getFib(0,1))+" ");
}
System.out.println();
Fib f = new Fib();
for (int i=0; i<numFibNum; i++) {
System.out.print(h1.getNextFibNum(f)+" ");
}
System.out.println();
FibImpl h2 = new FibImpl();
for (int i=0; i<numFibNum; i++) {
System.out.print(h2.getNextFibNum(f)+" ");
}
System.out.println();
f = new Fib();
for (int i=0; i<numFibNum; i++) {
f = h1.getNextFib(f);
System.out.print(f.getF1()+" ");
}
System.out.println();
} catch(Exception ex) {
ex.printStackTrace();
}
}
}
java
package fib;
import java.io.Serializable;
@SuppressWarnings("serial")
public class Fib implements Serializable {
private int f0;
private int f1;
public Fib() {
this(0,1);
}
public Fib(int f0, int f1) {
this.f0 = f0;
this.f1 = f1;
}
public int getF0() {
return f0;
}
public void setF0(int f0) {
this.f0 = f0;
}
public int getF1() {
return f1;
}
public void setF1(int f1) {
this.f1 = f1;
}
}
回答第一个问题:在第一种情况下,您在每次远程调用时都要创建一个新的
Fib
对象,因此始终从0+1开始。在第三种情况下,即使在客户端维护相同的对象,通过RMI对其所做的更改也不可见
不能通过RMI调用更改对象的内容,因为对象不同。当您调用RMI方法时,对象在另一端被序列化和反序列化,因此该对象实际上存在两个副本。在服务器端更改副本对客户端没有影响
在第四种情况下,您使用一个本地对象来计算斐波那契数,因此当传递给该方法的对象发生更改时,新内容在调用代码中可见。回答第一个问题:在第一种情况下,您在每次远程调用时都创建一个新的
Fib
对象,所以你总是从0+1开始。在第三种情况下,即使在客户端维护相同的对象,通过RMI对其所做的更改也不可见
不能通过RMI调用更改对象的内容,因为对象不同。当您调用RMI方法时,对象在另一端被序列化和反序列化,因此该对象实际上存在两个副本。在服务器端更改副本对客户端没有影响
在第四种情况下,您使用一个本地对象来计算斐波那契数,因此很明显,当传递给方法的对象发生更改时,新内容在调用代码中可见
package fib;
import java.io.Serializable;
@SuppressWarnings("serial")
public class Fib implements Serializable {
private int f0;
private int f1;
public Fib() {
this(0,1);
}
public Fib(int f0, int f1) {
this.f0 = f0;
this.f1 = f1;
}
public int getF0() {
return f0;
}
public void setF0(int f0) {
this.f0 = f0;
}
public int getF1() {
return f1;
}
public void setF1(int f1) {
this.f1 = f1;
}
}