Newsgroup: it.comp.java
Titolo: chiusura atipica di un socket

Salve a tutto il NG.
Ho un problema e chiedo lumi a voi. Ho un client e un server che dopo
una serie di istruzioni lettura-scrittura su uno stream,chiudono la
comunicazione.
Io vorrei riuscire a realizzare una chiusura "atipica" tale che,se il
server chiude la comunicazione in un qualsiasi istante (o lanciando una
throws new socket exception oppure semplicemente con un socket.close()
), il client non si accorge subito della caduta anche se deve fare
un'operazione di lettura dal DataStreamInput mediante la funzione
readin().
Mi spiego meglio:
se io chiudo il socket sul lato server (con un'eccezione o con la
funzione close,) e successivamente un client tenta di leggere dati con
un'istruzione del tipo datiIngresso.readIn(), viene lanciata una
eccezione da parte del lato client perchè non esiste più la
connessione con il server(visto che quast'ultimo ha chiuso il socket.)
In una rete di telecomunicazioni reali, però, non avviene questo:
quello che avviene è (in modo semplificato) che il client attende i
dati dal server per un certo tempo,allo scadere del quale interrompe
anch'esso la connessione.
E' quello che vorrei riuscire a fare io! Anche se il server chiude il
socket e successivamente il client usa l'istruzione readIn() non voglio
che venga lanciata un'eccezione sul lato client, ma voglio che
quest'ultimo attenda lo scadere di un timeout dopo il quale chiude la
connessione di sua volontà (socket.close()) ,senza che sia lanciata
un'eccezionje.
E' possibile??
Infine vorrei chiedere un'altra cosa:
quando io lancio throw new socket exception viene semplicemente
richiamata implicitamente la funzione socket.close() oppure accade
qualcos'altro?
Cioè,sono intercambiabili throws new socket exception e la funzione
close()?
Ringrazio  chiunque per qualsiasi risposta,come sempre!
Massimiliano


forse non devi usare il protocollo TCP, ma l'UDP

 close()?
Assolutamente no.

 chiamando una readln() sullo stream chiuso?".Io chiamo readIn () da parte del client perchè suppongo che questo ancora non sappia che il server è caduto all'improvviso.Il client pensa che la connessione sia ancora attiva e tenta di leggere con readIn( )...per questo io vorrei che aspettasse un po' di tempo e che allo scadere del timeout chiuda il socket anche lui...Invece se faccio socket.close( ) sul lato server, e poi readIn sul lato client( ) mi viene lanciata l'eccezione sul lato Client,come se questi sapesse già che il server è caduto! Ma lui non deve saperlo!Deve capirlo solo allo scadere del timeout...Il mio client dopo readIn() dovrebbe attendere lo scadere del timeout, non lanciare l'eccezione!!
Forse io non riesco a capire bene che cosa accade esattamente con
l'istruzione close()...se il server chiama la chiusura del suo socket o
lancia un'eccezione, quando e come il client ne avviene a conoscenza??
2)Tu dici che il throws socket Exception non c'entra nulla con
close()...Ma Come viene gestita tale eccezione in realtà?penso
chiamando socket.close( ), giusto?
Ti ringrazio in anticipo per eventuali nuove delucidazioni...
Massimiliano

 writes:
m> Forse io non riesco a capire bene che cosa accade esattamente con
m> l'istruzione close()...se il server chiama la chiusura del suo
m> socket o lancia un'eccezione, quando e come il client ne avviene a
m> conoscenza??
    If an unsolicited FIN arrives from the network, the receiving TCP
    can ACK it and tell the user that the connection is closing.  The
    user will respond with a CLOSE, upon which the TCP can send a FIN to
    the other TCP after sending any remaining data.  The TCP then waits
    until its own FIN is acknowledged whereupon it deletes the
    connection.  If an ACK is not forthcoming, after the user timeout
    the connection is aborted and the user is told.
"Se  dalla rete arriva  un FIN  non richiesto  [da una  chiusura della
 connessione lato client] lo  [stack] TCP ricevente può rispondere con
 un  ACK ed  avvertire  l'utente  che la  connessione  è in  chiusura,
 dopodiché lo  [stack] TCP può mandare  un FIN a sua  volta, dopo aver
 eventualmente trasmesso  i dati rimanenti. Quindi attende  che il suo
 FIN riceva un  ACK la connessione è cancellata. Se  lo ACK non arriva
 entro un limite  di timeout, la connessione è  abortita e l'utente ne
 viene informato"
Come vedi  lo stack TCP/IP  su cui si  poggia Java segnala la  cosa ai
programmi che lo utilizzano.
-- 
 /\           ___
/___/\_|_|\_|__|___Gian Uberto Lauri_____
  //--\| | \|  |   Integralista GNUslamico
\/                 e coltivatore diretto di Software

 chiamando socket.close( ), giusto?
Confondi causa con effetto. Il fatto che accedere ad un socket chiuso
si generi una eccezione non significa che generare la stessa eccezione
chiuda il socket...

Vi ringrazio veramente...ora mi è tutto più chiaro...
Massimiliano