RMI-Funktion wird lokal ausgeführt

Status
Nicht offen für weitere Antworten.
L

LeRoi

Gast
Hallo miteinander,

ich hab folgendes Problem mit RMI.
Ich schreibe ein kleines Programm bei welchem ein Client einen String an einen Server sendet
und dieser den String unbehandelt wieder zurück sendet (quasi nen echo). Der Client misst dabei
die benötigte Zeit. Das ganze wird mit verschiedenen Größen gemacht um eine Aussage über
Übertragungsrate etc. machen zu können. Nun hab ich folgendes Problem, ich habe 2 PC's
auf den einmal der Server auf den anderen der Client läuft. Nach der Zeitmessung brauchten selbst
grössere Daten (64MB) nur ein paar hundert Millisekunden für den Weg was mich stutzig machte. Ein println()
auf Serverseite ergab eine Ausgabe der Strings in der Console des Clients und nicht auf der Console des Servers.
Quasi wurde die Funktion lokal behandelt und nicht auf dem entfernten Rechner. Meine Frage ist: Wieso?? Müsste der
Stub das nicht an die Serinstanz auf den entfernten rechner weiterleiten??

Hier mal Auszüge aus dem Programm, ich find irgendwie nichts komisches dabei:

Server:

Code:
LocateRegistry.createRegistry(Registry.REGISTRY_PORT);
System.setSecurityManager(new RMISecurityManager());
Naming.rebind("RTTServer", im);
System.out.println("Server ready");
Echo-Funktion auf dem Server:
Code:
public String echo(String s) throws RemoteException {
	
    	return s;
	}

Client:

Code:
IServer server = (IServer) Naming.lookup("rmi://" + host
					+ "/RTTServer");
			server.echo("Test");

Ich hoffe jemand weiß ne Lösung, wäre dafür sehr dankbar.

MfG LeRoi
 
L

LeRoi

Gast
Die Implementierung sieht folgendermaßen aus:
Code:
public class ServerImpl extends UnicastRemoteObject implements IServer, Serializable{

	public ServerImpl() throws RemoteException {
		super();
	}
	
	

	private static final long serialVersionUID = 312248762588433799L;

       qOverride
	public String echo(String s) throws RemoteException {
		
    	return s;
	}

}

Es funktioniert jetzt tatsächlich, aber erst seitdem ich von UnicastRemoteObject erbe. Eigentlich
implementiert das ganze ja auch nur REmote und Serializable. Was ich ja vorher mit IServer und Ser.
auch schon hatte. Kann einer sagen wo da der Unterschied ist? Also wieso man UnicastRemoteObject
verwenden muss??

mfg LeRoi
 
T

tuxedo

Gast
Ist RMI nicht ein wenig "overkill" für eine Laufzeitmessung? Zumal ja RMI nicht gerade Firewall/Router freundlich istund unter umständen mehr als nur eine Socketverbindung benutzt ...

Oder war das nur zum testen der RMI-Geschwindigkeit gedacht? Was hast du denn für Messergebnisse erhalten?

- Alex
 
L

LeRoi

Gast
Das mit dem "overkill" stimmt. Das Programm soll aber auch genau das feststellen, also wie groß der Overhead
zwischen "nativen" Sockets und RMI ist. Und ob man es glaubt oder nicht im loaklen Netze gibts es nicht so
wahnsinnige Unterschiede im Transfervolumen (+10%). Jedenfalls nicht nach meinen Berechnunegn. Aber
ich bin auch noch am testen.

mfg LeRoi
 
T

tuxedo

Gast
Bin so nebenher dabei ein "besseres" RMI zu schreiben. Eins das nur eine Socketverbindung nutzt statt mehrere (im Fall der Callback-Benutzung).

So von der Technik her würd ich sagen dass da nicht allzuviel Traffic erzeugt wird. Die einzelnen Methodenaufrufe erzeugen recht wenig overhead. Bei mir wird hier nur der Name des Objekts, sowie der Name der aufzurufenden Methode, als auch die Parameter serialisiert. Klar. Je komplexer die Parameter sind, desto größer der Overhead (bedingt durch den Objekt-Overhead).

Wenn du genaueres gemessen hast lass es uns wissen.

- Alex
 

HoaX

Top Contributor
LeRoi hat gesagt.:
Es funktioniert jetzt tatsächlich, aber erst seitdem ich von UnicastRemoteObject erbe. Eigentlich
implementiert das ganze ja auch nur REmote und Serializable. Was ich ja vorher mit IServer und Ser.
auch schon hatte. Kann einer sagen wo da der Unterschied ist? Also wieso man UnicastRemoteObject
verwenden muss??

a) weil es so ist ;)
b) wenn du in die apidoc schaust sieht du, dass UnicastRemoteObject mehr bietet als die 2 Interfaces zu implementieren
 
G

Gast

Gast
Aber wie bekomme ich dann (sauber!) die folgende Klasse dazu, von UnicastRemoteObject zu erben?


Code:
public class NetworkAcceptor extends Acceptor implements Serializable, NetworkAcceptorInterface {
...
}

Die Basisklasse hat absolut nichts mit Netzwerken zu tun - und sollte insofern auch nicht von UnicastRemoteObject erben...

*sic*.
 
T

tuxedo

Gast
Also ich kenn keinen anderen Weg außer von UnicastRemoteObject zu erben... Von daher wirst du dein Design anpassen müssen.

Außer es ist hier jemand schlaucher und kennt eine andere Lösung ..

- Alex
 
G

Gast

Gast
Also irgendwie komme ich nicht weiter, obwohl ich hier und auch anderen Stellen durch das Netz stöber... Anfänglich hatte ich auch das Problem, daß meine Methoden lokal aufgerufen werden. Daher jetzt der manuelle Export über das UnicastRemoteObject.

Bei meinem Code:

Code:
    ...
    /**
     * Die NetworkAcceptoren im Netzwerk publizieren.
     * 
     * @param discoveryManager Der DiscoveryManager.
     */
    public void publishNetworkAcceptors(DiscoveryManager discoveryManager) {
        for (int i = 0; i < networkAcceptors.size(); i++) {
            NetworkAcceptor acceptor = networkAcceptors.get(i);
            try {
                logger.debug("RMI: Registriere '" + acceptor.getName() + "'");
                acceptor = (NetworkAcceptor) whatIsIt(UnicastRemoteObject.exportObject(acceptor, 0));
                LocateRegistry.getRegistry(Registry.REGISTRY_PORT).bind(acceptor.getName(), acceptor);

                logger.debug("Bonjour: Populiere " + acceptor.getName() + " in Bonjour.");
                discoveryManager.addNetworkAcceptor(acceptor);
            } catch (Exception ex) {
                logger.fatal("FATAL", ex);
            }
        }
    }

    private Object whatIsIt(Object o) {
        logger.debug("Object is "+o);
        return o;
    }
    ...

bekomme ich die Meldung (Fehler bezieht sich auf die Zeile 13 mit dem UnicastRemoteObject):

Code:
2007-12-17 15:22:12,126 DEBUG [main] (Element.java:138) - RMI: Registriere '[IP|1744155] Eingang'
2007-12-17 15:22:12,343 DEBUG [main] (Element.java:151) - Object is Proxy[NetworkAcceptorInterface,RemoteObjectInvocationHandler[UnicastRef [liveRef: [endpoint:[134.60.236.229:52517](local),objID:[0]]]]]
2007-12-17 15:22:12,352 FATAL [main] (Element.java:145) - FATAL
java.lang.ClassCastException: $Proxy0
        at de.logistik.simulation.Element.publishNetworkAcceptors(Element.java:139)
        at de.logistik.simulation.ElementListe.publishNetworkAcceptors(ElementListe.java:109)
        at de.logistik.Simulation.publishNetworkAcceptors(Simulation.java:232)
        at de.logistik.Simulation.main(Simulation.java:221)

Was ja eigentlich bedeutet, ich erbe nicht von Remote in meinem Interface. Aber das sieht so aus:

Code:
/*
 * NetworkAcceptorInterface.java
 *
 * Created on 24. März 2007, 14:20
 */
package de.logistik.network.rmi;

import de.logistik.exceptions.UnknownColorException;
import de.logistik.exceptions.UnknownParameterException;
import de.logistik.exceptions.WrongCubeException;
import de.logistik.simulation.Cube;
import de.logistik.simulation.Element;
import java.rmi.Remote;
import java.rmi.RemoteException;

/**
 * Das Interface für RMI.
 * 
 * @author caschoff
 * @version 1.0
 */
public interface NetworkAcceptorInterface extends Remote {

    public boolean accept(Cube wuerfel)
            throws WrongCubeException, UnknownColorException, UnknownParameterException, RemoteException;

    public int getFilterColor()
            throws RemoteException;

    public Element getElement()
            throws RemoteException;
    
    public String getName()
            throws RemoteException;
}

... und die Implementierung so:

Code:
/*
 * NetworkAcceptorInterface.java
 *
 * Created on 24. März 2007, 14:20
 */
package de.logistik.network.rmi;

import de.logistik.simulation.Acceptor;
import java.io.Serializable;
import org.apache.log4j.Logger;

/**
 * Der NetzwerkAcceptor braucht einen eindeutigen Namen!
 * 
 * @author caschoff
 * @version 1.0
 */
public class NetworkAcceptor extends Acceptor implements Serializable, NetworkAcceptorInterface {

    /** Der Logger. Siehe log4j.properties. */
    private static final Logger logger = Logger.getLogger(NetworkAcceptor.class);
    /** Ein Prefix für den Namen, damit er eindeutig wird. */
    private String prefix;

    public NetworkAcceptor(String name, int filterColor) {
        super(name, filterColor);

        prefix = "[IP|" + hashCode() + "] ";
    }

    @Override
    public String getName() {
        return prefix + super.getName();
    }

    @Override
    public String toString() {
        return "NetworkAcceptor [name = " + getName() + ", colorFilter = " + getFilterColor() + ", element = " + getElement() + "]";
    }
}

Irgendein Tipp?

Grüße,
Christian
 

Niki

Top Contributor
Nur am Rande, man muss nicht von UnicastRemoteObject ableiten. Du kannst das Objekt auch einfach exportieren. Dann kann es von jeder x-beliebigen Klasse ableiten:
exportObject
 
G

Guest

Gast
Nur am Rande, man muss nicht von UnicastRemoteObject ableiten. Du kannst das Objekt auch einfach exportieren. Dann kann es von jeder x-beliebigen Klasse ableiten

Ja, das mache ich ja in Zeile 13 des ersten Quellcodes...
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F Extasys TCp Client extends Funktion Netzwerkprogrammierung 0
T Bezeichner "end of line" für die Funktion readline Netzwerkprogrammierung 5
Y Socket geziehlt Funktion auf dem Server aufrufen Netzwerkprogrammierung 3
D Nachfrage zu der genauen funktion folgendes codes Netzwerkprogrammierung 12
E Wie erstelle ich eine blockiernde Funktion? Netzwerkprogrammierung 12
D Javascript Funktion aus Java Anwendung ausführen Netzwerkprogrammierung 5
J Funktion zum Maskieren der Sonderzeichen einer URL Netzwerkprogrammierung 2
T Möglichkeit über das Netzwerk eine Funktion zu starten? Netzwerkprogrammierung 2
A Bei FTP Übertragung wird Datei nicht komplett übertragen Netzwerkprogrammierung 2
OnDemand JMS Messages wird gecached Netzwerkprogrammierung 2
P RMI stub wird nicht gefunden Netzwerkprogrammierung 8
I Socket ObjectOutputStream-Socket: Objekt wird falsch übertragen Netzwerkprogrammierung 2
M com.google.gson wird nicht erkannt Netzwerkprogrammierung 2
F Website parsen, die mit javascript zusammengebaut wird Netzwerkprogrammierung 1
P Socket Server übertragung wird immer langsamer Netzwerkprogrammierung 4
A Socket Socket-Problem - Object wird nicht übertragen Netzwerkprogrammierung 3
M Client sendet nur, wenn das Socket geschlossen wird Netzwerkprogrammierung 53
L Server anpingen (Pingzeit) ?? Pingzeit wird nicht verändert Netzwerkprogrammierung 6
M JSP wird im gesamten Projekt nicht neugeladen Netzwerkprogrammierung 3
K Socket InputStream wird nicht erzeugt Netzwerkprogrammierung 4
R Socket SSL-Connect in Servlet - keystore wird nicht gefunden Netzwerkprogrammierung 2
S anderer Rechner wird nicht gefunden Netzwerkprogrammierung 20
M Problem Client - Server Sockets: .ready() wird nie true! Netzwerkprogrammierung 6
X Änderung des Objekts wird nicht serialisiert Netzwerkprogrammierung 9
M Socket TCP keep alive Exception wird nicht ausgelöst Netzwerkprogrammierung 11
F getSource Methode wird als Bot erkannt Netzwerkprogrammierung 8
Dit_ RMI setSoTimeout wird ignoriert? Netzwerkprogrammierung 3
lumo String[] wird zu null bei Serialisierung Netzwerkprogrammierung 8
J method = PUT, aber ausgeführt wird doGet...? Netzwerkprogrammierung 4
K Was wird genau per Telnet verschickt ? Netzwerkprogrammierung 5
M Dateidownload per FTP wird immer langsamer und bleibt dann stehen Netzwerkprogrammierung 3
J BufferedReader.ready() wird nicht true Netzwerkprogrammierung 10
A Socket BufferedReader.readLine() blockiert bis ein im Socket OutputStream was gesendet wird ... Netzwerkprogrammierung 9
C RMI Klasse wird unter falschem Pfad gesucht Netzwerkprogrammierung 4
B Server-Programm wird durch "read" beendet Netzwerkprogrammierung 8
A Socket Client Server Connection wird aufgebaut aber keine daten geschickt. Netzwerkprogrammierung 5
N Socket Verbindung wird immer verweigert Netzwerkprogrammierung 5
K HTTP-Anfrage an einen Server wird nicht beantwortet Netzwerkprogrammierung 3
M URL Handler wird nicht gefunden Netzwerkprogrammierung 6
L SSL Verbindung aber Server wird erst im Programm festgelegt Netzwerkprogrammierung 4
L Https Verbindung wird aus jar heraus nicht aufgebaut Netzwerkprogrammierung 12
C Download-Fortschritt wird falsch angezeigt. Netzwerkprogrammierung 2
A Quellcode von Homepage wird nicht komplett eingelesen Netzwerkprogrammierung 5
V RMI: code wird einfach übergangen ? Netzwerkprogrammierung 3
A FileChannel+SocketChannel:Datei wird nur teilweise übertrage Netzwerkprogrammierung 4
F Stream wird als Char übertragen. Char -> in String umwand Netzwerkprogrammierung 5
A RMI: Wo wird die Methode ausgeführt? Netzwerkprogrammierung 9
P JNDI LDAP-SSL Verbindung, Zertifikat wird nicht angezeigt ? Netzwerkprogrammierung 2
A JavaMail Problem - Nachricht wird nicht versendet ? Netzwerkprogrammierung 9
T finlalize Methode vom Server wird nicht aufgerufen Netzwerkprogrammierung 4
B Socket wird nicht richtig geschlossen Netzwerkprogrammierung 2
K mapSystemException wird geworfen Netzwerkprogrammierung 2
L Attachment wird nicht angezeigt in der Email Netzwerkprogrammierung 3
P RMI - meine Stub-Class wird nicht gefunden Netzwerkprogrammierung 9
G Socket wird nach Portscann geschlossen Netzwerkprogrammierung 2
R Socket wird nicht ausgeführt Netzwerkprogrammierung 6
S RMI Methodenaufruf funktioniert nur lokal Netzwerkprogrammierung 11
T Laufen Objekte, die vom Cajo-Server geliefert werden, lokal auf dem Client? Netzwerkprogrammierung 4
M RMI lokal über externe IP geht nicht Netzwerkprogrammierung 5
G RMI + Applet - Verbindung nur lokal Netzwerkprogrammierung 27

Ähnliche Java Themen


Oben