kostenloser Webspace werbefrei: lima-city


Addressfreigabe nach socket.close()

lima-cityForumProgrammiersprachenJava

  1. Autor dieses Themas

    alphara

    Kostenloser Webspace von alphara

    alphara hat kostenlosen Webspace.

    Heiho.

    Ich hab ein kleines Problem und der große Google will mir nicht helfen:

    Ich hab ein serversocket aufgesetzt, dazu einen Timeout definiert und diesen dann auf eine eingehende Verbindung warten lassen. Wenn jetzt der socket wieder geschlossen wird, weil der Timeout greift, kann ich die Verbindung nicht wieder aufbauen, weil java den Vorgang mit der Meldung "java.net.BindException: Address already in use" abbricht.

    Frage: Wie geb ich die reservierte Addresse wieder frei?

    Codabschnitt:

    Socket sock;
    ServerSocket servsock = new ServerSocket(9000);
    try {
           servsock.setSoTimeout(60000);
           sock = servsock.accept();
    }
    catch (Exception f) {
    	sock.close();
    	servsock.close();
    }


    vielen Dank schon mal im vorraus.

    Beitrag zuletzt geändert: 16.3.2010 17:21:36 von alphara
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. Hi,
    dein Code funktioniert bei mir soweit einwandfrei. Du sagst während der 60 Sekunden bis zum Timeout geht keine Anfrage von einem Client ein, oder?
    Für weitere Analyse würde ich vorschlagen du postest mehr Code.

    Gruß
    Manni
  4. Autor dieses Themas

    alphara

    Kostenloser Webspace von alphara

    alphara hat kostenlosen Webspace.

    Nein, das Problem liegt so:

    Der Server wartet ja auf eine Anfrage vom Client. Kommt diese nicht, dann gibts einen Timeout und die Exception wird zurückgeworfen - soweit normal. Versuche ich jetzt aber erneut die Verbindung aufzubauen, läuft das Programm gar nicht an, sondern bricht sofort mit oben genannter Exception ab. Dabei dachte ich, dass die Verbindung mit sock.close() sowohl beendet also auch alle Reservierungen wieder frei gibt. Aber dem ist wohl nicht so, sonst würde ja ein erneuter Programmablauf genau gleich laufen, wie der erste. Meine Frage bezieht sich also genau auf die Freigabe der reservierten Verbindung nachdem der Timeout reagiert hat.

    Zur Info: der Programmabschnitt läuft innerhalb eines Threads, der beendet wird, wenn die Exception zurück kommt. Starte ich den Thread neu, dann tritt erwähntes Problem auf, bis ich das ganze Programm beende und neu starte. Dann tuts wieder genau ein mal.

    Beitrag zuletzt geändert: 16.3.2010 22:13:03 von alphara
  5. Hi,
    alphara schrieb:
    Nein, das Problem liegt so:
    nun ja, offenbar bist du nicht so recht bereit zur Lösung des Problems beizutragen, wenn sich das "Nein" auf das Posten von Code bezieht. Wie stellst du dir vor, dass man das Problem lösen soll, ohne es ganz zu kennen? (bitte auch beachten was weiter unten steht)
    Meine Frage bezieht sich also genau auf die Freigabe der reservierten Verbindung nachdem der Timeout reagiert hat.
    Ich behaupte mal, wenn du das Problem tatsächlich soweit eingrenzen könntest, dann könntest du es auch lösen ;). Offenbar sind aber die Zusammenhänge anders als du glaubst und genau deshalb hast du ein Problem.
    Noch mal ins Blaue: Kannst ja mal versuchen das
    ServerSocket servsock = new ServerSocket(9000);
    ausserhalb der run Methode auszuführen (weiß ja nicht ob es schon so ist, hab ja keinen code ;))
    Ansonsten viel Glück für dein Projekt und ich wünsch dir Hilfe von jemanden, der besser raten kann als ich und auch die Zeit und Lust hat um Spielchen zu spielen.

    Gruß
    Manni
  6. Autor dieses Themas

    alphara

    Kostenloser Webspace von alphara

    alphara hat kostenlosen Webspace.

    1. Ich kann dir gerne 500 Zeilen Code Posten, wenn du das willst, aber ich halte das echt für unnötig, da sich das Problem auf genau diese Zeilen beschränkt.

    2. Ich weiß auch genau, WAS das Problem ist, ich weiß nur nicht, WIE man es löst (desshalb sollte man eig gar keinen Code brauchen) aber für dich formuliere ichs auch gerne nochmal:

    Wie lösche ich eine Verbindungsreservierung eines InetAddress-Objektes?

    3. Das "Nein" bezog ich lediglich darauf, dass ich das Gefühl hatte, dass du mein Problem gar nicht verstanden hast und ich das nochmal umformulieren wollte

    So und auf deinen besonderen Wunsch hin, folgt nun das komplette Umfeld (sry, auch das ist nicht der komplette Code, aber wenn dir das nicht reicht, dann weiß ich auch nicht)

    //Methode, die per ActionListener von einem Button aufgerufen wird
    public void net_control() {
    		if (net_started) { 
    			try {
    				sock.shutdownOutput();
    				sock.close();
    				stop.setEnabled(false); //Buttons und Menuepunkte umsetzen
    				start.setEnabled(true);
    				Itm_net_open.setEnabled(true);
    				Itm_net_close.setEnabled(false);
    				net_started=false; // flag, der anzeigt, ob das Netzwerk steht
    				failcomander.append("TCP-Verbindung getrennt\n"); //Ausgabe in ein JTextArea
    			}
    			catch (Exception e) {
    				failcomander.append("TCP-Trennung fehlgeschlagen\n");
    			}
    		}
    		else {
    			Thread busdriver = new Thread(new net_runner());
    			failcomander.append("verbinde TCP\n");
    			start.setEnabled(false);
    			Itm_net_open.setEnabled(false);
    			busdriver.start();
    		}
    	}
      
    	private class net_runner implements Runnable {
    		public void run() { 
    			try {
    				ServerSocket servsock = new ServerSocket(9000);
    				failcomander.append("TCP-Socket eingerichtet\nWarte auf Anfrage (60s)\n");
    				try {
    					servsock.setSoTimeout(60000);
    					sock = servsock.accept();
    				}
    				catch (Exception f) {
    					failcomander.append("TCP-Pingtimeout\n");
    					sock.close();
    					servsock.close();
    				}
    				in = new BufferedReader(new InputStreamReader(sock.getInputStream()));
    				out = new BufferedWriter(new OutputStreamWriter(sock.getOutputStream()));
    				StringBuffer daten = new StringBuffer();
    				stop.setEnabled(true);
    				Itm_net_close.setEnabled(true);
    				net_started=true;
    				failcomander.append("TCP-Verbindung hergestellt\nParameter:\n"+sock.toString()+"\n");
    			}
    			catch (Exception e) {
    				failcomander.append("TCP-Verbindung fehlgeschlagen\n\n"+e.toString()+"\n\n");
    				start.setEnabled(true);
    				Itm_net_open.setEnabled(true);
    			}
    		}
    	}


    €dit: Hab die Lösung des Problems gefunden. Nur für den Fall, dass es irgendwen interessiert:

    Man muss einfach zuerst den serversocket schließen und dann den anderen socket (und nicht anderst herum), denn sock.close() gibt tatsächlich die Verbindung frei, aber solange der serversocket noch läuft kann wohl auf Grund des accept() der sock nicht geschlossen werden.

    Im übrigen hätten dazu 2 Zeilen Code ausgereicht... und jemand der sich damit genau auskennt ;-):wave::prost:

    Beitrag zuletzt geändert: 17.3.2010 22:52:08 von alphara
  7. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!