Newsgroup: it.comp.java
Titolo: Socket immortale :D

Oggetto un po' pomposo per attirare l'attenzione, ma e' veritiero del 
contenuto.
Il mio problema e' questo.. ho una banalissima applicazione client/server 
che lavora via socket. Il server fa una accept e ad ogni connessione 
istanzia un thread che altrettanto banalmente entra in un ciclo, in cui 
prima fa una read e poi esegue un'azione in base al dato appena letto. 
Questo finche' il client non manda un "codice" di fine o si verifica una 
socket exception; in entrambi i casi si chiude tutto e si finisce il ciclo.
Bene, la cosa interessante e' questa: client e server sono connessi in 
wireless; se durante la fase di comunicazione si spegne il wireless, cosi' 
tanto per fare una prova, il risultato che si ottiene e' che mentre il 
client ottiene la socket exception, il server fa la sua read 
tranquillamente, come se niente fosse successo. La read produce un timeout 
(che ho gestito ed ignorato, perche' e' un caso accettabile nel 
funzionamento dell'applicazione) ma nessuna eccezione, quindi si esegue una 
nuova read e non se ne esce piu'.
E la cosa e' ripetibile (grosso leak fra l'altro, se lo faccio N volte mi 
trovo N thread inutili che leggono all'infinito). Allora ho messo un po' di 
output sul server e quello che leggo mi lascia perplesso:
isBound = true
isClosed = false
isConnected = true
isInputShutdown = false
isOutputShutdown = false
Ma come??? Se spengo il wireless, la socket rimane comunque valida?
Dov'e' che sbaglio... o cosa non ho capito?
Grazie,
CarMas 

 writes:
C> Bene, la cosa interessante e' questa: client e server sono connessi
C> in wireless; se durante la fase di comunicazione si spegne il
C> wireless, cosi' tanto per fare una prova, il risultato che si
C> ottiene e' che mentre il client ottiene la socket exception, il
C> server fa la sua read tranquillamente, come se niente fosse
C> successo. La read produce un timeout (che ho gestito ed ignorato,
C> perche' e' un caso accettabile nel funzionamento dell'applicazione)
C> ma nessuna eccezione,
Non credo che sia un bene ignorare il timeout. Mi spiego.
A me puzza che succeda questo
  * lo  strato MAC  del client,  sente che  sparisce  il collegamento,
    quindi segnala la  cosa ad IP che lo segnala a  TCP che lo segnala
    alla JVM dove si traduce nella eccezione
  * lo strato MAC  del server NON sente che  sparisce il collegamento,
    quindi non segnala niente, per IP  tutto va bene, per TCP tutto va
    bene e si aspetta il timeout.
Perché questo  accade?  A  naso direi proprio  che il  Client, dovendo
trasmettere, non sente la risposta  dell'access point WiFi e quindi si
accorge che il collegamento è interrotto.
Il  server da  parte sua,  è in  attesa di  dati, anche  se  non sente
segnale  non si  preoccupa,  quando  lo AP  WiFi  avrà da  trasmettere
trasmetterà, salvo timeout. Se poi il server non parla in wireless con
il dispositivo WiFi, beh, che sia  spento o non sia spento il cavo c'è
:), non può accorgersi che il collegamento è scaduto :).
Forse è  il caso di  trovare il modo  di poter gestire i  timeout come
eccezioni, al limite includendo  un meccanismo di keep alive periodico
per cui se non c'è traffico entro  il tempo di timeout è sicuro che il
link è giù.
-- 
 /\           ___
/___/\_|_|\_|__|___Gian Uberto Lauri_____
  //--\| | \|  |   Integralista GNUslamico
\/                 e coltivatore diretto di Software