Addressfreigabe nach socket.close()
lima-city → Forum → Programmiersprachen → Java
anfrage
button
code
datum
frage
freigabe
komplette umfeld
methode
normal versuche
posten
problem
programm
reservierten verbindung
run
start
trennung
treten
umsetzen
verbindung
zeile
-
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 -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage
-
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 -
Hi,
alphara schrieb:
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)
Nein, das Problem liegt so:
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
ausserhalb der run Methode auszuführen (weiß ja nicht ob es schon so ist, hab ja keinen code ;))ServerSocket servsock = new ServerSocket(9000);
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 -
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
Beitrag zuletzt geändert: 17.3.2010 22:52:08 von alphara -
Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!
lima-city: Gratis werbefreier Webspace für deine eigene Homepage