2012-03-24 6 views
1

Ich habe 2 Fragenfür das Programm Ergebnis über RMI

Das Ergebnis wird wie folgt angezeigt werden.

  1. Warum sind die ersten drei Ergebnisse der sa mich?
  2. Warum die vierte kann mit dem Remote-Implementierung-Objekt arbeiten. Hier

ist der Code:

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

Antwort

1

Um ans war die erste Frage: In den ersten Fällen erstellen Sie ein neues Objekt Fib bei jedem Remote-Aufruf, so dass Sie immer mit 0 + 1 beginnen. Im dritten Fall ändert sich, obwohl auf der Client-Seite Sie das gleiche Objekt beibehalten über RMI zu tun sind nicht sichtbar.

Sie können den Inhalt eines Objekts nicht durch einen RMI-Aufruf ändern, da sich die Objekte unterscheiden. Wenn Sie eine RMI-Methode aufrufen, wird das Objekt auf der anderen Seite serialisiert und deserialisiert, sodass tatsächlich zwei Kopien des Objekts existieren. Das Ändern der Kopie auf der Serverseite hat keine Auswirkungen auf die Clientseite.

Im vierten Fall verwenden Sie ein lokales Objekt, um die Fibonacci-Zahlen zu berechnen, so dass offensichtlich, wenn das an die Methode übergebene Objekt geändert wird, der neue Inhalt im aufrufenden Code sichtbar ist.

Verwandte Themen