RMI: Remote Object ohne Naming Service benutzen?

Status
Nicht offen für weitere Antworten.

RSchwarzkopf

Neues Mitglied
Hallo,

mich lässt eine Behauptung von William Grosso in seinem Buch über RMI nicht mehr los. Seite 141, der Absatz mit Pfoten

Practically speaking (...) you use a "well-known-port" to connect to the server. That is, instead of using UnicastRemoteObject's zero-argument constructor, you pass in a port number. This can be convenient because it enables a client to bypass a naming service. (...)

Also irgendwie ist mir absolut noch nicht klar, wie das funktionieren soll. Okay, ich kenne dann den Endpunkt, und kann mir damit einen sun.rmi.transport.tcp.TCPEndpoint basteln. Soweit klar. Um das Objekt aber benutzen zu können benötige ich ja eine java.rmi.server.RemoteRef, genauergesagt eine sun.rmi.server.UnicastRef. Damit ich die erzeugen kann benötige ich wiederum eine sun.rmi.transport.LiveRef. Dabei nützt mir der Endpunkt jetzt ein bisschen was. Zusammen mit einer Object ID kann ich daraus die LiveRef basteln, daraus die UnicastRef und damit krieg ich dann sogar einen Stub (sofern ich die Klasse des Stubs habe, mit Proxies hab ich's noch nicht probiert) und kann das Objekt aufrufen. Mal davon abgesehen, das das erzeugen der Objekt ID ein ganz schöner Aufriss war (mangels passendem Konstruktor, die Jungs von Sun wissen sicher warum es den nicht gibt..), muss man die ja auch erstmal kennen..

Nun aber zu meiner eigentlichen Frage: Seh ich die ganze Sache zu technisch? Meint der vielleicht was ganz anderes damit?? Sowas vermute ich nämlich.. Hat vielleicht irgendeiner eine Idee was dem Mann da vorschweben könnte? Vielleicht hat jemand auch schonmal sowas implementiert??

Bin für jeden Tip dankbar!

MfG
Roland
 

Killerzwelch

Mitglied
Hi Roland,

ja, es geht, dass ist die Information die man überall im Netz findet.

Die Antwort auf die Frage wie ist:
Das Remote Object muss serialisiert werden und per UDP an den Client gesand werden
(das ist die Aufgabe, die sonst die RMIRegistry übernimmt). Im Code ist noch ein Broadcast enthalten der per UDP im lokalen Netz Rechner aufstöbert, dieser Teil kann ignoriert werden und ist nur der Vollständigkeit halber enthalten...

Die magische Methode, ist die toStub()-Methode (line 5) im zweiten Code-Ausschnitt, dies ist der Proxy für den Client, der serilisiert übers Netz geschickt werden muss.
Beispiel Code könnte so aussehen und sollte adptierbar sein:
Java:
public class CalcRunner {

	public static void main(String[] args) throws Exception {
		// Send helo
		DatagramSocket socket = new DatagramSocket();
		DatagramPacket helo = new DatagramPacket("helo".getBytes(), 4, InetAddress.getByName("127.0.0.1"), 56789);
		socket.send(helo);
		
		// Receive reply (blocking call)
		byte[] replyBuf = new byte[1024];
		DatagramPacket reply = new DatagramPacket(replyBuf, replyBuf.length);
		socket.receive(reply);
		
		ByteArrayInputStream is = new ByteArrayInputStream( reply.getData() );
		ObjectInputStream in = null;
		Remote stub;

		in = new ObjectInputStream(is);
			
		stub = (Remote) in.readObject();
			
		in.close();

	    CalcClient cc = new CalcClient( (Calc) stub);
	    System.out.println( cc.add( 1, 2) );
}}

Java:
public class CalcProvider {
	public static void main(String[] args) throws Exception {
		CalcImpl ci = new CalcImpl();
		
	    Remote stub = RemoteObject.toStub( ci );

	    ByteArrayOutputStream bs = new ByteArrayOutputStream();
	    ObjectOutputStream out = null;
	    out = new ObjectOutputStream(bs);
	    out.writeObject(stub);
	    out.close();
	    
	    byte[] seri = bs.toByteArray();
	    
	    DatagramSocket serverSocket = new DatagramSocket( 56789 );
		
    	byte[] receiveData = new byte[4];
    	while(true) {
    		
    		DatagramPacket receivePacket = new DatagramPacket(receiveData, receiveData.length);
    		serverSocket.receive(receivePacket);
    		
    		InetAddress clientIp = receivePacket.getAddress();
    		int port = receivePacket.getPort();
    		
    		System.out.println( "Sending stub to whoever" );
    		
    		DatagramPacket sendPacket = new DatagramPacket(seri, seri.length, clientIp, port);
    		serverSocket.send(sendPacket);
	    
}}}

Hoffentlich erspart dies einigen Menschen grauenvolle Transformationsversuche und API Recherchen ;)

Schönen Gruß
Roland
(ich denke wir haben uns an der Uni Siegen bereits kennengelernt?!)
 
T

tuxedo

Gast
Wow, das sowas geht wusste ich nicht...

Vielleicht steh ich auch auf dem Schlauch, aber in welchem Szenario würde man sowas einsetzen?

- Alex
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
W RMI Verschiedene Unterobjekte trotz selbem Remote Object Netzwerkprogrammierung 2
K Java RMI bricht ab wenn Remote eine Methode ausgeführt werden soll Netzwerkprogrammierung 5
S .jar läuft local, aber nicht remote (SSH/Terminal) Netzwerkprogrammierung 10
L Remote Desktop per Java steuern Netzwerkprogrammierung 4
J Prüfen, ob remote UDT Server erreichbar ist Netzwerkprogrammierung 0
K Ansprechen eines Remote Druckers Netzwerkprogrammierung 2
S Socket Remote Administration Tool / Fernwartungsprogramm Netzwerkprogrammierung 9
D Remote-Objekt-Server : Alternative Methodenaufruflogik zu Reflection und hart codiert Netzwerkprogrammierung 5
S Socket Remote Desktop Netzwerkprogrammierung 19
X SSH Verbindung zu Remote Datenbank Netzwerkprogrammierung 2
J Windows Unix remote Netzwerkprogrammierung 2
W scan remote UDP port Netzwerkprogrammierung 6
K Remote - Desktop Netzwerkprogrammierung 15
J Socket - Remote/Client Mac-Adresse? Netzwerkprogrammierung 3
G Remote der serialisieren Netzwerkprogrammierung 3
K Remote Shell in Java? Netzwerkprogrammierung 6
R PID's auf remote PC unter Windows herrausfinden Netzwerkprogrammierung 2
M RMI AbstractTableModel als Data Transfer Object (DTO) nutzen Netzwerkprogrammierung 0
A Socket Socket-Problem - Object wird nicht übertragen Netzwerkprogrammierung 3
B XMLRPC-Schnittstelle. Einzelne Felder aus dem Object auslesen Netzwerkprogrammierung 2
0 Apache Commons File Object bekommen Netzwerkprogrammierung 4
M Objekt über Object-Stream, empfange "alte" Daten Netzwerkprogrammierung 2
H Object Cast Problem nach Übertragung mit Log4j Netzwerkprogrammierung 5
J Array oder Object über Sockets Netzwerkprogrammierung 8
A Get a Bean from the session object Netzwerkprogrammierung 2
J RMI - Call-By-Object-Reference? Netzwerkprogrammierung 4
C Problem mit Object-Stream Netzwerkprogrammierung 3
S RMI ExportException object already exported Netzwerkprogrammierung 1
S object via post auf servlet send und weiter bearbeiten Netzwerkprogrammierung 11
T TCP mit und ohne Threads Netzwerkprogrammierung 1
V Socket Audio Clip loopen ohne neuen Thread Netzwerkprogrammierung 2
L Socket Wie kann man in Java die Anzahl der Objekte in einem InputStream sehen ohne ihn durchgehen zu müssen Netzwerkprogrammierung 1
Q-bert Link zugang ohne login sperren. Netzwerkprogrammierung 1
L Socket Zwei Computer im gleichen Netwerk ohne Portforwarding ? Netzwerkprogrammierung 12
J HTTP Befehl via HTTP senden ohne Browser öffnen Netzwerkprogrammierung 3
B JSch Filetransfer ohne KnownHosts Datei? Netzwerkprogrammierung 0
D GZIP InputStream lesen ohne zu encoden Netzwerkprogrammierung 1
T UDP Pakete empfangen ohne Programm zu blockieren Netzwerkprogrammierung 3
D Zugriff auf Webinhalte ohne visuelles Öffnen der Website Netzwerkprogrammierung 2
T Anwendungseinstellungen ohne Datei übertragen? Netzwerkprogrammierung 8
B Socket BufferedImage senden "ohne speichern" Netzwerkprogrammierung 7
N (TCP) Verbindung ohne Portforwarding Netzwerkprogrammierung 12
B Socket BufferedReader.readLine() beenden ohne den Stream zu closen Netzwerkprogrammierung 7
D Mit wsimport erstellte Klassen ohne WSDL nutzen Netzwerkprogrammierung 4
T Datei downloaden ohne den Dateinamen zu kennen Netzwerkprogrammierung 2
D RMI Gui auf client updaten basierend auf den Property Änderung des Models auf dem Server ohne polling Netzwerkprogrammierung 12
B FTP Datei auslesen ohne einloggen möglich? Netzwerkprogrammierung 19
E RMI ohne Portforwarding? Netzwerkprogrammierung 2
M Ping mehrerer Ports aus int[] ohne for-Schleifendurchlauf Netzwerkprogrammierung 11
C Login ohne Erfolg Netzwerkprogrammierung 2
L einfacher server ohne threads Netzwerkprogrammierung 4
P RMI ohne Security Netzwerkprogrammierung 5
J Client ohne Server? Netzwerkprogrammierung 7
K Socket Daten lesen ohne Längenangabe Netzwerkprogrammierung 19
0 soap client ohne WSDL Netzwerkprogrammierung 3
J Connection Speed Test ohne Applet Netzwerkprogrammierung 5
E DatagramSocket rausfinden ob recive möglich ohne zu blocken Netzwerkprogrammierung 10
O Webservice ohne Eclipse laufen lassen Netzwerkprogrammierung 3
T Server ohne Port Netzwerkprogrammierung 4
L RMI Programm beendet ohne Fehler sofort nach Start (Windows 2000) Netzwerkprogrammierung 7
C imap/java emails checken ohne runterzuladen? Netzwerkprogrammierung 3
T ohne Port Freigabe. Netzwerkprogrammierung 6
P P2P ohne Portfreigabe Netzwerkprogrammierung 12
J Client-Client-Chat ohne Serverbeteiligung Netzwerkprogrammierung 2
G Connection zu MySQL ohne ODBC Netzwerkprogrammierung 8
G TCP Verbindung überprüfen OHNE daten zu verschicken Netzwerkprogrammierung 11
T select() ohne NIO - oder wie Worker-Thread sauber beenden? Netzwerkprogrammierung 9
Paule Connection Applet Servlet ohne Socket bzw RMI Netzwerkprogrammierung 2
L http kommunikation mit und ohne multipart Netzwerkprogrammierung 4
K RMI ohne Kommandozeileneingabe Netzwerkprogrammierung 9
M Ende des Streams ohne Schließen/Checksumme mitsenden Netzwerkprogrammierung 2
G SSL Verbindung ohne Zertifikat Netzwerkprogrammierung 9
D Timeouts ohne Ende bei SMTP und FTP Netzwerkprogrammierung 3
M Client-Kommunikation ohne Server Netzwerkprogrammierung 7
M schreiben auf geschlossenen Socket ohne Exception Netzwerkprogrammierung 6
A server mit 2 Ports : Mit und ohne SSL Chat system Netzwerkprogrammierung 10
K Applet - Servlet Kommunikation ohne Sockets Netzwerkprogrammierung 5
J Vom BufferedReader lesen -> hängt ohne Fehler,ohne Except Netzwerkprogrammierung 2

Ähnliche Java Themen

Neue Themen


Oben