# RMI: Ports freigeben



## Sven (23. Dez 2004)

Habe ein kleines RMI-Projekt in Eclipse erstellt. Das ganze lässt sich leider noch nicht optimal über eclipse starten, d..h. es startet einmal und reserviert dann den Port und gibt ihn nicht mehr her.  Nun möchte ich eine "diconnect"-Methode schreiben welche dieses macht. Leider weis ich nicht wie, wäre super wenn mir jemand helfen könnte...

Ich habe mich an folgendes RMI-Beispiel gehalten:

http://www.zerokspot.com/docs/programming.java.rmi.tutorial-ger/


----------



## foobar (23. Dez 2004)

> d..h. es startet einmal und reserviert dann den Port und gibt ihn nicht mehr her.


Dann wird der Prozess nicht wirklich beendet. Hast du den 
Prozess auch abgebrochen?


----------



## Guest (23. Dez 2004)

Ja, der Prozess wird abgebrochen. Aber die Ports werden nicht wieder freigegeben.


----------



## Sven (27. Dez 2004)

Keiner ne Idee?


----------



## Guest (27. Dez 2004)

Hier der Code der Methode:


```
public void enableServer() throws RemoteException{
		
	String host;
	´
                //Server-Objekt in die RMIRegistry eintragen
	LocateRegistry.createRegistry(1234);
	System.out.println( "Registry created" );
		
	//Sicherheitsmanager setzen
	if(System.getSecurityManager() == null)
	{
		System.setSecurityManager(new RMISecurityManager());
	}
		
	try {
			
		// Gibt den HOST rechner an 
		host=InetAddress.getLocalHost().getHostName();
			
		// Das Objekt "TAPServer" auf Port 1234 wird auf host zur Verfügung gestellt		
		String adresse = "rmi://" + host + ":1234//workspace/TAPServer/taprmi";
			
			
		//Naming.rebind()  kontaktiert die lokale rmiregistry  und 
		//hinterlegt oder ersetzt dort einen Verweis auf ein Objekt, 
		//das dem Interface genügt, das der Klient erwartet*/
       Naming.rebind(adresse, new TAPServerImpl());	

       System.out.println( "Bindings Finished" );
       System.out.println( "Waiting for Client requests" );
			
	}catch (Exception e){
		e.printStackTrace();
	}
	
}
```


Jetzt möchte ich noch ne Mathode "disableServer" schreiben welche den Port wieder freigibt.
Jemand eine Idee wie ich dies machen könnte?


----------



## Niki (4. Jan 2005)

Ich bin mir nicht 100% sicher, aber ich glaube sobald der Server ein System.exit() aufruft sollte der Port wieder frei gegeben werden, würde also einfach eine shutdown Methode einbauen, die das System.exit() aufruft. Was du auch machen kannst ist, statt LocateRegistry.createRegistry zuerst einmal ein getRegistry aufrufen, und erste wenn beim rebind eine Exception geworfen wird ein createRegistry.
Könnte wie folgt aussehen:


```
int port = 1234;
    try{
        System.out.println("try to get registry at port " + port);
        Registry reg = LocateRegistry.getRegistry(port);
        reg.rebind([SERVICENAME],[SERVICE]);    
        System.out.println("service bound to rmi registry");
    } catch(Exception ex){
        System.out.println("couldnt get registry, try to create one");
        try{
            Registry reg = LocateRegistry.createRegistry(port);
            reg.rebind([SERVICENAME],[SERVICE]);    
            System.out.println("service bound to rmi registry");
        }catch(Exception ex){
            System.out.println("unable to bind service");
            ex.printStackTrace();
        }
    }
```


----------



## Sven (5. Jan 2005)

Danke. Hab's mit System.exit() gemacht


----------

