Quiz mit RMI Probleme mit RMI start

BodyLAB

Bekanntes Mitglied
Hallo zusammen,

ich versuche ein Socket Programm in ein RMI Programm zu "Transformieren". Das Problem was ich jedoch habe ist das ich bereits am Anfang scheitere.
Wenn ich im Server ein Objekt rebind und versuche es mit dem Client per lookup zu nutzen, schreibt er mir im Client immer nur den Namen des lookup Objektbezeichner raus.

Hier mal der Code:
Der Handler soll übermittelt werden und die Serverlogik beinhalten.
Java:
import java.rmi.*;
import java.rmi.server.UnicastRemoteObject;
import java.util.Random;

public class Handler extends UnicastRemoteObject implements IHandler {
    private static final long serialVersionUID = 1L;
    private Random random;
    private int a;
    private int b;
    private char operator;

    public Handler() throws RemoteException {
        super();
        random = new Random();
        a = random.nextInt(20) + 1;
        b = random.nextInt(20) + 1;
        operator = getRandomOperator();
//        new Thread(this).start();
    }

    @Override
    public String startQuiz() throws RemoteException {
        return "Frage des Tages: Wieviel ist " + a + " " + operator + " " + b + " ?\nErgebniss bitte eingeben: ";
    }
    
    @Override
    public boolean antworten(String ergebnis) throws RemoteException {
        double clientResult = Double.parseDouble(ergebnis);
        switch (operator) {
        case '+':
            return (a + b == clientResult);
        case '-':
            return (a - b == clientResult);
        case '*':
            return (a * b == clientResult);
        case '/':
            return (a / b == clientResult);
        case '%':
            return (a % b == clientResult);
        }
        return false;
    }

    private char getRandomOperator() {
        int r = random.nextInt(5); // Intervall [0, 5)
        switch (r) {
        case 0:
            return '-';
        case 1:
            return '*';
        case 2:
            return '/';
        case 3:
            return '%';
        case 4:
            return '+';
        }
        return '+';
    }

}

Java:
import java.rmi.*;
public interface IHandler extends Remote {
    public String startQuiz() throws RemoteException;
    public boolean antworten(String ergebnis) throws RemoteException;
}

Der Server: hier stelle ich es mir so vor das dieser nur ein Handler Objekt zur Verfügung stellt.
Java:
import java.rmi.Naming;
import java.rmi.registry.LocateRegistry;
public class Server {
    public static void main(String[] args) {
        try {
            Handler myQuiz = new Handler();
            LocateRegistry.createRegistry(1055);
            
            Naming.rebind("Test", myQuiz);
            System.out.println("Server ist gestartet");
            
        } catch (Exception e) {
            System.out.println("Ausnahme: " + e.getMessage());
            e.printStackTrace();
        }
    }
}

Zum Schluss noch der Client: nunja der Client soll sich ein Handler Objekt beschaffen und über diese Serverlogik möchte ich dann im Client die Quizlogik aufbauen.
Java:
import java.rmi.*;

public class Client {

    public static void main(String[] args) {
        try {
        System.out.println("1");
            Handler myQuiz = (Handler) Naming.lookup("//localhost:1055/Test");
            System.out.println("2");
            String test = myQuiz.startQuiz();
            
        } catch(Exception e) {
            System.out.println(e.getMessage());
        }
    }
}

Wie zu erkennen ist versuche ich im Client schon mit
Code:
System.out.println("2");
nach dem lookup noch etwas auszugeben, das geht nur nicht. Die 2 sehe ich nie auf der Konsole. Ich sehe eine 1 und dann Test.

Weis jemand wieso das so ist?
 
Ich habe folgendes geändert:
Java:
public class Server {
    public static void main(final String[] args) {
        try {
            System.setProperty("java.rmi.server.hostname", "192.168.178.32");

            final Handler myQuiz = new Handler();
            final Registry rgsty = LocateRegistry.createRegistry(1055);
            rgsty.bind("Test", myQuiz);

            System.out.println("Server ist gestartet");

        } catch (final Exception e) {
            System.out.println("Ausnahme: " + e.getMessage());
            e.printStackTrace();
        }
    }
}
Java:
public class Client {

    public static void main(final String[] args) {
        try {

            System.out.println("1");
            final IHandler myQuiz = (IHandler) Naming.lookup("rmi://192.168.178.32:1055/Test");
            System.out.println("2");
            final String test = myQuiz.startQuiz();

        } catch(final Exception e) {
            System.out.println(e.getMessage());
        }
    }
}
Die IP-Adresse musst du natürlich anpassen. Beachte auch: im Client muss man das Interface verwenden.
 
Hallo,
also so wie du es oben geschrieben hast, bekomme ich den Server nicht übersetzt.
Server.java:11: error: cannot find symbol
final Registry rgsty = LocateRegistry.createRegistry(1055);
^
symbol: class Registry
location: class Server
1 error
Wenn ich den Server wie von mir oben angegeben nutze und den Client anpasse passiert immer noch der selbe Fehler wie oben.

__________
Okay, ich hab das ganze in Eclipse kopiert und gemerkt das Registry ein import noch zusätzlich benötigt.
Nun bekomme ich alles übersetzt doch leider ist die Ausgabe immer noch die selbe :-(
 
Du musst natürlich die Imports angeben. Registy ist java.rmi.registry.Registry und das wird dann vermutlich entsprechend weiter gehen z.B. mit LocateRegistry (gleicher Namespace wie Registry)....

Was für eine Entwicklungsumgebung nutzt Du? Du solltest schauen, wie diese Dich unterstützen kann, denn Imports sollte jede Entwicklungsumgebung einbauen können.
 
Was für eine Entwicklungsumgebung nutzt Du? Du solltest schauen, wie diese Dich unterstützen kann, denn Imports sollte jede Entwicklungsumgebung einbauen können.
Ich mach das gerade alles in VisualStudioCode ohne Hilfe (muss mich noch auf eine Prüfung vorbereiten).
War aber in diesem Fall ein Fehler RMI ist nicht Prüfungsrelevant interessiert mich einfach und sah hier in dem Buch so einfach aus. Doch mir ist nicht mal aufgefallen das im Client das Interface genutzt wird (es steht auch einfach nicht da /also das Interface nutzen die schon im Code/ nur steht es nicht im ErklärText 😀)

Nun geht es mit besagtem Code von @Oneixee5

Danke 🙂 Vermutlich melde ich mich hier erneut denn nun hab ich ja erst mal eine Verbindung. Möchte später gerne auch noch eigene Objekte übertragen etc. Listen die dann Serialisiert werden müssen (so viel weiß ich schon mal 😀).
 

Zurück
Oben