RMI: Ports freigeben

Status
Nicht offen für weitere Antworten.
S

Sven

Gast
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/
 
G

Guest

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

Guest

Gast
Hier der Code der Methode:

Code:
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

Top Contributor
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:

Code:
    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();
        }
    }
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen


Oben