Newsgroup: it.comp.java
Titolo: Socket in stato di CLOSE_WAIT

Salve a tutti,
    ho implementato un'applicazione client server in cui la chiamata HTTP
effettuata dal client (un cellulare) viene inoltrata da un gateway alla mia
parte "server" costituita da alcune servlet e altre classi.
Quando mi arriva la request, io recupero lo stream su cui poi andrň a
scrivere la risposta cosě:
new DataOutputStream(response.getOutputStream())
dopo aver scritto i dati che mi interessano, chiudo lo stream dentro un
finally.
Ora, dopo alcune ore che testo l'applicazione con soli uno, due utenti, se
faccio netstat sulla console del server in cui gira l'applicazione, vedo
molti socket in stato di CLOSE_WAIT e ho paura che questo possa essere un
problema con l'aumentare del numero di utenti.
Quello che vorrei chiedervi č:
- se qualcuno di voi ha avuto problemi simili e come li ha risolti (se č
possibile).
- se la cosa č legata al mio utilizzo e chiusura dello stream di output
oppure se sia un problema dovuto ad altre cause.
- se č corretto chiudere lo stream ottenuto dalla response (mentre magari
dovrebbe occuparsene il container). In effetti visto che creo un nuovo
oggetto partendo da quello della response il dubbio mi sembra legittimo.
Grazie e ciao,
Andrea

 (mentre magari dovrebbe occuparsene il container).
... in questi casi la regola e': SEMPRE chiudere TUTTO
esplicitamente APPENA FINITO L'UTILIZZO, in modo
che il container prenda atto che la risorsa non e' piu' in uso
a livello "logico" e possa provvedere a rilasciarla fisicamente.
In caso contrario, il container/SO deve verificare periodicamente
da quanto ogni risorsa sia inutilizzata, e dopo un certo tempo limite
iniziare la propria procedura di default per la progressiva chiusura
e rilascio (socket in TIME_WAIT).
Se il tempo limite e' lungo (15 - 30 minuti sono normali per FTP e
HTTP), non chiudendo le connessioni rischi di lasciare talmente tanti
socket "appesi" che non ne restano piu' disponibili da aprire per le
nuove richieste, e l'applicazione si blocca (visto succedere piu' volte).
Per cui: aprire sempre tutto il piu' tardi possibile (un attimo prima di
usare) e chiudere sempre tutto nel giusto ordine il piu' presto possibile
(appena finito di usare)!
Buon lavoro
--
Gnomo
...any way the wind blows...


Grazie altrettanto,
Andrea

 sia stato chiuso e il rilascio tardi dall'altro estremo della connessione?
... la mia (limitata) esperienza e' che normalmente:
- quando chiudi tutto per bene, il socket resta in CLOSE_WAIT solo per
qualche secondo, il tempo di chiudere ordinatamente anche dall'altra parte;
- quando non chiudi o la chiusura fallisce, il socket resta in CLOSE_WAIT
finche' non scade il time-out (15 o 30 o quanti minuti, dipende dalle
impostazioni locali di sistema);
per cui la risposta e' nell'orologio, anche se ci possono sempre essere
situazioni in cui le cose non vanno normalmente...    :-)
Attento soprattutto se si verifica un'eccezione proprio sulla close(),
p.es
. se cerchi di chiuderla quando e' gia' chiusa - prova questo...:
//////////////////////////
 // Connection MUST be closed before returning
 if (null != theConnection && !theConnection.isClosed()) {
  try {
   theConnection.close();
  }
  catch (Exception e) {
   System.out.println("[NomeJsp] - error closing Connection, ignored [" +
(null == e.getMessage() ? e.toString() : e.getMessage()) + "]");
  }
 }
 theConnection = null;
//////////////////////////
HTH
