# socket.close() Problem ----- java.net.BindException



## jogomu (21. Jun 2006)

Hallo!

Ich habe in meiner Client-Applikation eine Socket Klasse. Aus der generiere ich ein Socket Objekt und kann darüber mit dem SocketServer Daten austauschen. Sobald ich aber die Verbindung mit socket.close() schliesse und und wieder aufbauen will, erhalte ich folgende Fehlermeldung:

java.net.BindException: Address already in use: connect
	at java.net.PlainSocketImpl.socketConnect(Native Method)
	at java.net.PlainSocketImpl.doConnect(Unknown Source)
	at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
	.........

Es sieht aus, als ob das Betriebssystem den Port nicht direkt freigibt. Wenn ich nun 1-2 Minuten warte, kann ich die Verbindung wieder aufbauen. Wie kann ich diese Problem lösen, dass ich direkt nach dem socket.close() die Verbindung wieder neu aufbauen kann??

Vielen Dank für eure Antworten.

Gruss
Jogomu


----------



## The_S (21. Jun 2006)

Hm, schau mal ob du es mit einer kleinen Schleife lösen kannst, die solange durchläuft bis socket.isClosed() true zurück liefert. Evtl. ist der Socket noch nicht komplett geschlossen, ähnlich wie Bilder noch net komplett geladen seien können.

Ist aber nur eine Vermutung  :?


----------



## Murray (21. Jun 2006)

Sieh Dir mal Socket#setReuseAddress an; das dort beschrieben Verhalten hört sich nach dem von Dir geschilderten Problem an.


----------



## jogomu (22. Jun 2006)

Hallo Murray,

vielen Dank für deine Tip. Und es ist tatsächlich so, dass man mit setReuseAddress() das gewünschte Verhalten erlangt. 

Mein Problem nun ist, dass socket.setReuseAddress(true) vor dem Verbinden geschehen muss (socket.isbound() =>false). Da meine Applikation durch eine Firewall muss, kann ich nur 2 bestimmte Ports benutzen. Bis anhin habe ich meinen Socket folgendermassen generiert:


```
socket= new Socket(server_ip, up_port, local_ip, down_port);
```


Wie kann ich nun dem Socket den down_port mitteilen??


```
socket = new Socket();
socket.setReuseAddress(true);
socket.connect(server_ip, up_port);
```


Die Funktion socket.connect() erlaubt ja nur die mitteilung des Server Ports. Gibt es einen anderen Weg den local Port dem Socket mitzuteilen?


Besten Dank für deine Antwort.

Jogomu


----------



## Murray (23. Jun 2006)

Über das API sehe ich keine Möglichkeit. Aber vielleicht kannst Du von Socket ableiten und die bind()-Methode überschreiben:


```
public class MySocket extends Socket {

  public MySocket( InetAddress address, int port, InetAddress localAddr, int localPort) throws IOException {
     super( address, port, localAddr, localPort);
  }

  /* wird aus dem super-Konstruktor aufgerufen */
  public void bind( SocketAddress bindpoint) {
    setReuseAddress( true);
    super.bind( endpoint);
  }
}
```


----------

