Newsgroup: it.comp.java
Titolo: Socket e Thread ... HELP!

Salve a tutti,
e' qualche tempo che seguo questo NG sfruttando le segnalazioni fatte, ma
ora ho un problema che non riesco a risolvere da sola.
Con il mio codice, creo un ServerSocket "primario" che si mette in ascolto
sulla porta 8101. Tutte le volte che mi arriva una richiesta da un client,
si genera un ServerSocket "secondario" che gestisce lo scambio dati col
client.
Il problema e' questo: quando un ServerSocket secondario entra in timeout (5
min.) il programma finisce killando anche il ServerSocket primario (il cui
timeout e' di 10 min.), mentre questo non accade se il ServerSocket
secondario si chiude "normalmente" quando ha finito di lavorare.
Qualcuno puo' aiutarmi?
Grazie mille in anticipo,
    Maggie
public class MultiServer {
    private final static int TIMEOUT = 600000; //ten minutes
    public static void main() {
        ServerSocket s = null;
        ServerSocket mom = null;
        Socket c = null;
        int momport = 0;
        s = new ServerSocket(8101);
        s.setSoTimeout(TIMEOUT);
        while (TRUE) {
            c = s.accept();
            mom = new ServerSocket(0);
            momport = mom.getLocalPort();
            ThreadLoc locale = new ThreadLoc(mom);
            locale.start();
        }
}
public class ThreadLoc extends Thread
    private final static int TIMEOUT = 300000; //five minutes
    ServerSocket serverSock = null;
    ThreadLoc(ServerSocket serverS){
        serverSock = serverS;
    }
    public void run(){
        ...
    }
}

>....
Ciao & buon lavoro!
 Francesco Mascarello
 email: 
masca...@keycomm.it
  (senza la F)

 }
Quando accept() ti riporta un socket che si è connesso, dovresti passa
tale socket al metodo ThreadLoc. Perchè istanzi un serversocket
'secondario' su una porta casuale? Ci credo che il tutto andrà in
timeout! Come fai a dire al client su quale porta si trova il
serversocket secondario?
Il socket riportato da accept() non è altro che un socket che è GIA' in
gradi di scambiare i dati col server.
Inoltre quando imposti il SO_TIMEOUT, se non ci sono collegamenti entro
quel numero di secondi verrà lanciata una  InterruptedIOException.
Siccome tu non trappi nessuna eccezione nel tuo codice, la
InterruptedIOException risalirà su su su fino alla JVM terminandola.
Spero di esserti stato di aiuto.
Ciao,
	Stefano

 
ehm... setDaemon non è un metodo del ServerSocket ma un metodo dei
Thread. Inoltre la JVM uscirà quando tutti i thread sono daemon. Quindi
se anche teoricamente s.setDaemon() fosse possibile, impostarlo a daemon
aumenterebbe decixsamente le possibilità di una uscita da parte della
JVM. :)
Ciao,
	Stefano

Siccome tu non trappi nessuna eccezione nel tuo codice
A dire il vero il codice e' molto complesso, quindi ne ho riportato solo
alcune parti: scusami se non sono stata abbastanza precisa :-)
Per chiudere il ThreadLoc in caso di timeout (InterruptedIOException) e di
errori vari, ho risolto creando un grande loop in run() ed utilizzando
break. Sicuramente il metodo non e' molto "ortodosso": sarebbe stato piu'
"pulito" usare close() per killare il thread in cui il SS secondario si e'
bloccato, ma il method e' deprecate ... peccato.
Grazie mille a tutti per il tempo dedicato al mio problema :-)
Alla prossima,
  Maggie