# RMI, Spring und IP



## Aeroflare (25. Mai 2009)

Hallo!

Ich hab mal wieder eine Frage und hoffe ihr könnt mir helfen 

Ich verwende RMI zusammen mit dem Springframework, wobei ich das Problem habe, dass ich die IP zur Compilezeit noch nicht kenne. Die IP wird (so wie ich es bisher überall gesehen habe) in der xml direkt gespeichert (und ich glaub nicht, dass ich die xml-Datei zur Laufzeit ändern muss um dynamische IPs zu verwenden  )

Wie funktioniert sowas genau? Ich hoffe ihr könnt mir helfen


----------



## SlaterB (25. Mai 2009)

was ist denn 'die IP'? die vom RMI-Server aus Sicht des Clients?
natürlich muss die irgendwo konfiguriert sein und wenn die dynamisch ist, kann die auch niemand per Zauberhand raten,

oder möchtest du, dass das Programm sie setzt, z.B. nach Eingabe in einem Textfeld oder LookUp zu einer Adresse wie www. google. de?
(ich weiß dann aber nicht unbedingt weiter  )


----------



## Aeroflare (25. Mai 2009)

Ja, gedacht war per Textfeld die IP (des Servers) einzugeben.


----------



## SlaterB (25. Mai 2009)

wenn ich dann doch mehr als eine Sekunde nachdenke, dann wird die IP doch letzlich im Programm angegeben,
siehe z.B.
Getting Started Using RMI

> obj = (Hello)Naming.lookup("//" + getCodeBase().getHost() + "/HelloServer"); 
usw.
an der Stelle kann man doch eine beliebige Programmvariable einbinden?
oder welchen Code verwendest du, bei Spring mag ja alles anders sein


----------



## SlaterB (25. Mai 2009)

schau dir folgendes Beispiel an:
Spring Remote (RMI + HTTP)

dort muss zumindest nur eine Datei 'rmi-client.properties' geändert werden, das ginge vielleicht noch


----------



## tfa (25. Mai 2009)

Du kannst die Propertys der Beans auch programmatisch ändern, das ist am einfachsten.
Zum Beispiel:

```
ApplicationContext ctx = new ClassPathXmlApplicationContext("clientContext.xml");

RmiProxyFactoryBean r = (RmiProxyFactoryBean) ctx.getBean("&nameServiceBean");
r.setServiceUrl("rmi://127.0.0.1:1099/ServiceName");

MeinService service = (MeinService) r.getObject();
```

Man beachte das *&* vor dem Bean-Namen. Das verhindert, dass das RmiProxyFactoryBean gleich das Service-Objekt erzeugt. Es wird vielmehr die Factory selbst zurückgeliefert. Und die kann man dann wie gewünscht umkonfigurieren. In der (statischen) Config muss allerdings schon eine formal gültige URL stehen, sonst gibt es einen Laufzeitfehler.


----------



## Aeroflare (25. Mai 2009)

tfa hat gesagt.:


> Du kannst die Propertys der Beans auch programmatisch ändern, das ist am einfachsten.
> Zum Beispiel:
> 
> ```
> ...



Ah, sehr gut! Genau das hab ich gesucht.

Vielen Dank!


----------



## Aeroflare (21. Jun 2009)

Ah!! Panik!

Der Code funktioniert nicht! Er greift trotzdem noch auf die IP zu, die in der xml steht. (Der Fehler ist mir erst jetzt aufgefallen, als ich zwei verschiedene Rechner verwendet hab um das zu testen...). Hab das so:


```
try{
			ClassPathXmlApplicationContext ctx = new ClassPathXmlApplicationContext("rmi-client.xml");
			RmiProxyFactoryBean r = (RmiProxyFactoryBean) ctx.getBean("&remoteMethods");
			r.setServiceUrl("rmi://"+ip+":1099/remoteMethods");
			otherPlayer = (RemoteMethods) r.getObject();
			otherPlayer.setClient(2);
			
			new ClassPathXmlApplicationContext("rmi-server.xml");
		}
catch (BeanCreationException ex){}
```
sobald er jetzt das zweite Mal den Code aufruft verbindet er sich normal zu sich selbst. Selbst wenn der Server des anderen schon steht kann er sich nicht zu diesem connecten (die BeanCreationException wird auch bereits beim ApplicationContext erstellen geworfen..


----------

