Mi è capitato di scrivere del codice che scrive/legge da socket di rete ed ho riscontrato un baco (per me è un baco) che mi ha fatto perdere un sacco di tempo, il mio codice era simile a questo:
DatagramSocket s = new DatagramSocket(7777);
InetAddress indirizzo = s.getLocalAddress();
byte[] buf = new byte[65536];
DatagramPacket recv = new DatagramPacket(buf, buf.length);
s.receive(recv);
s.close
Sostanzialmente la prima riga crea un socket e fa il bind sulla porta locale 777 (prima riga in grassetto) poi il codice continua e aspetta dalla rete qualcosa (s.receive) e alla fine chiude e dealloca tutto (s.close). Il problema che ho riscontrato è che lui non deallocava un bel niente e rilanciando l’applicazione non riusciva più a fare il bind perchè rimaneva allocato dal giro di prima. Cercando in giro in internet ho risolto cambiando la prima riga così:
s = new DatagramSocket(null);
s.setReuseAddress(true);
s.bind(new InetSocketAddress(7777));
Sostanzialmente inizializza il socket a null poi fa il bind a mano. In questo caso quando fa la close (s.close) rilascia correttamente il socket a livello sistema operativo.