за результат программы про RMI - PullRequest
1 голос
/ 24 марта 2012

У меня есть 2 вопроса

Результат будет отображаться, как показано ниже.

1 1 1 1 1

1 1 1 1 1

1 1 1 1 1

1 2 3 5 8

1 2 3 5 8

  1. Почему первые три результата одинаковы?
  2. Почему четвертый может работать с использованием объекта удаленной реализации.

Вот код:

FibClient.java

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();
        }
    }

}

FibImpl.java

package fib;
import java.rmi.RemoteException;
import java.rmi.server.UnicastRemoteObject;
@SuppressWarnings("serial")
public class FibImpl extends UnicastRemoteObject implements FibInterface {
public FibImpl() throws RemoteException {
    super();
}
public Fib getFib(int f0, int f1) throws RemoteException {
    return new Fib(f0, f1);
}
public int getNextFibNum(Fib f) throws RemoteException {
    sleep(500);
    int nextFib = f.getF0() + f.getF1();
    f.setF0(f.getF1());
    f.setF1(nextFib);
    return nextFib;
}
public Fib getNextFib(Fib f) throws RemoteException {
    sleep(500);
    int nextFib = f.getF0() + f.getF1();
    f.setF0(f.getF1());
    f.setF1(nextFib);
    return f;
}
private void sleep(int time) {
    try {
        Thread.sleep(time);
    }
    catch(InterruptedException ex) {
        ex.printStackTrace();
    }
}
}

Fib.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;
}   
}

1 Ответ

1 голос
/ 24 марта 2012

Чтобы ответить на первый вопрос: в первом случае вы создаете новый объект Fib при каждом удаленном вызове, поэтому вы всегда начинаете с 0 + 1. В третьем случае, даже если на стороне клиента вы находитесьпри сохранении одного и того же объекта изменения, внесенные в него через RMI, не видны.

Вы не можете изменить содержимое объекта с помощью вызова RMI, поскольку объекты отличаются.Когда вы вызываете метод RMI, объект сериализуется и десериализуется с другой стороны, поэтому фактически существуют две копии объекта.Изменение копии на стороне сервера не повлияет на клиентскую сторону.

В четвертом случае вы используете локальный объект для вычисления чисел Фибоначчи, поэтому, очевидно, когда объект, переданный методу, изменяется,новое содержимое отображается в коде вызова.

...