# RMI und Problem mit rmic-Tool



## bandy (28. Feb 2012)

Hallo,

ich habe folgendes Programm


```
import java.rmi.Remote;
import java.rmi.RemoteException;

public interface Befragung extends Remote{
public Frage getFrage() throws RemoteException;
public void putAntwort(int antwort) throws RemoteException;
}
```


```
import java.rmi.Naming;
import java.rmi.RemoteException;
import java.rmi.registry.LocateRegistry;
import java.rmi.server.UnicastRemoteObject;

public class BefragungImpl extends UnicastRemoteObject implements Befragung{
  private static final long serialVersionUID = 1L;
  private String frageString="";
  private int antwortBereich=0;
  private int tnZahl=0;
  private double antwortAv=0.0;

  public BefragungImpl(String frageString, int antwortBereich) throws RemoteException {
   this.frageString=frageString;
   this.antwortBereich=antwortBereich;  
  }

  public Frage getFrage()throws RemoteException{
    return new Frage(frageString, antwortBereich, tnZahl, antwortAv);
  }
  
  public void putAntwort(int antwort)throws RemoteException{
    antwortAv=(antwortAv*tnZahl+antwort)/(++tnZahl);
    System.out.println("\t"+tnZahl+" Teilnehmer\t"+antwortAv+"\t Antwortdurchschnitt");   
  }
  
  public static void main (String [] args){
    if(args.length==2){
      BefragungImpl bef;
      try{
        LocateRegistry.createRegistry(1099);
        int range=0;
        try{
        range=Integer.parseInt(args[1]);
        }catch(Exception e){}
        bef=new BefragungImpl(args[0], range);
        Naming.bind("RMI-Befragung", bef);
        System.out.println("\n*** Bereit fuer RMI's ***\n");
      }catch(java.rmi.AlreadyBoundException abEx){
             System.out.println("BefragungImpl: "+abEx.toString());
      }catch(java.net.MalformedURLException malUrlEx){
        System.out.println("BefragungImpl: "+malUrlEx.toString());
      }catch(RemoteException remEx){
        System.out.println("BefragungImpl: "+remEx.toString());
      }
    }else{
       System.out.println("BefragungImpl: "+"\n\tAufruf mit einem Frage-String in \"...\""+"\n\tund einer Zahl fuer den Antwortbereich");
    }
  }
}
```


```
public class Frage extends Object implements java.io.Serializable{
  private static final long serialVersionUID = 1L;
  private String frageString;
  private int antwortBereich;
  private int tnZahl;
  private double antwortAv;
  
  public String getFrageString(){
    return frageString;
    }
  
  public int getAntwortBereich(){
    return antwortBereich;
  }

  public int getTnZahl(){
    return tnZahl;
  }
 
  public double getAntwortAv(){
    return antwortAv;
  }
  
  public Frage(){}
  
public Frage(String frageString, int antwortBereich, int tnZahl, double antwortAv){
    this.frageString=frageString;
    this.antwortBereich=antwortBereich;
    this.tnZahl=tnZahl;
    this.antwortAv=antwortAv;
  }
}
```


```
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.Reader;
import java.rmi.Naming;
import java.rmi.RemoteException;

public class FrageClient {
Frage frage;
Befragung remoteObject;
StringBuffer strBuffer;
String antwort;

public FrageClient(){}

public static void main(String[] args) {
  FrageClient client=new FrageClient();
  client.execute();
}

private void execute() {
 try {
  remoteObject=(Befragung) Naming.lookup("rmi://127.0.0.1:1099/RMI-Befragung");
  frage=remoteObject.getFrage();
  System.out.println("Die Frage des remote-Objectes:\n");
  System.out.println(frage.getFrageString()+"\n");
  System.out.println("Ihre Antwort. Moeglichkeiten von 0 bis "+frage.getAntwortBereich()+": \n");
} catch (java.rmi.NotBoundException nbEx) {
  System.out.println("FrageClient: "+nbEx.toString());
}catch (java.net.MalformedURLException malUrlEx) {
  System.out.println("FrageClient: "+malUrlEx.toString());
}catch (RemoteException remEx) {
  System.out.println("FrageClient: "+remEx.toString());
}
 
 boolean schleife=true;
 int iAntwort=0;
 while(schleife){
   if((antwort=konsolenDaten()) !=null){
     try{
       iAntwort=Integer.parseInt(antwort);
       if(iAntwort<=frage.getAntwortBereich()&& iAntwort>=0){
         try{
           remoteObject.putAntwort(iAntwort);
           double tnAvneu=(frage.getAntwortAv()*frage.getTnZahl()+iAntwort)/(frage.getTnZahl()+1);
           System.out.println("Durchschnitt "+tnAvneu+" bei "+(frage.getTnZahl()+1+" Teilnehmern"));
           schleife=false;
     }catch(RemoteException remEx){
       System.out.println("BefragungImpl: "+remEx.toString());
       schleife=false;
     }
   }else
     System.out.println("Die Zahl liegt nicht  "+"im gueltigen bereich, bitte noch einmal:");
 }catch(NumberFormatException nfEx){
System.out.println("BefragungImpl: "+nfEx.toString());   
System.out.println("\nUngueltige Eingabe: Es muss eine Zahl eingegeben werden. Bitte noch einmal:"); 
 }
   }else  System.out.println("Fehler ");
 } 
}

public String konsolenDaten(){
  strBuffer=new StringBuffer();
  char ch;
  try{
    Reader in=new InputStreamReader(System.in);
    while((ch=(char)in.read())!='\r'){
      strBuffer.append(ch);
    }
    System.out.println("Eingegeben: "+strBuffer.toString());
    return strBuffer.toString();
  }catch(IOException ioe){
    System.out.println("BefragungImpl: "+ioe.toString()); 
    return null;
  }
}
}
```

Mit dem rmic-Tool soll ich mit folgendem Befehl

```
rmic BefragungImpl
```
Zwei weitere class-Dateien erzeugen, die BefragungImpl_Skel.class und BefragungImpl_Stub.class, es wird aber nur BefragungImpl_Stub.class erzeugt, warum?:bahnhof: Mache ich etwas falsch ?:bahnhof:


----------



## Kr0e (29. Feb 2012)

Nur kurz Zeit grad: rmic wird ab JDK 5 (Oder war es sogar schon 4 ?) nicht mehr benötigt. Falls du es machen MUSST mit rmic, so kann ich dir nicht helfen, da ich noch nie damit gearbeitet habe -> Vollkommen veraltet.


----------



## L-ectron-X (29. Feb 2012)

Das stimmt, seit Java 5 übernimmt der Java-Compiler javac die Funktionen von rmic.
Skeleton- und Stubklassen werden nun automatisch erzeugt.

Hab hier mal ein Video-Tutorial zu RMI unter Java 5 gefunden. Hoffe, das hilft dir weiter
Tutorial RMI mit Java 5 in Eclipse Video - sevenload


----------



## bandy (29. Feb 2012)

Kr0e hat gesagt.:


> Nur kurz Zeit grad: rmic wird ab JDK 5 (Oder war es sogar schon 4 ?) nicht mehr benötigt. Falls du es machen MUSST mit rmic, so kann ich dir nicht helfen, da ich noch nie damit gearbeitet habe -> Vollkommen veraltet.



Aber Danke fuer den Versuch zu helfen



L-ectron-X hat gesagt.:


> Das stimmt, seit Java 5 übernimmt der Java-Compiler javac die Funktionen von rmic.
> Skeleton- und Stubklassen werden nun automatisch erzeugt.
> 
> Hab hier mal ein Video-Tutorial zu RMI unter Java 5 gefunden. Hoffe, das hilft dir weiter
> Tutorial RMI mit Java 5 in Eclipse Video - sevenload



Sieht gut aus das Video, sollte schon helfen, Danke!


----------

