Visualizzazione dei risultati da 1 a 2 su 2

Discussione: chiusura dei socket

  1. #1

    chiusura dei socket

    Ho scritto due software che si scambiano oggetti tramite socket, tutto funziona tranne l'accorgersi di uno dei software che l'altro si è arrestato.
    Infatti se termino un'applicazione con ctrl+c mi aspetto che l'altro si accorga che il socket non è più in essere, invece non è così.

    Per controllare che tutto sia ancora funzionante ho scritto questo metodo:


    codice:
        public boolean isAttivo(){
            boolean esito = true;
            
            if ( !isAttivo )
                esito = false;
            
            
            if ( !socket.isConnected() || 
                    socket.isClosed() || 
                    !socket.isBound() || 
                    socket.isInputShutdown() || 
                    socket.isOutputShutdown() ) {
                
                if ( debug >1 )
                    logger.warn("Il server non e' attivo");
    
    
                esito = false;
            } else 
                if ( debug >4 )
                    logger.warn("Il socket e' attivo");
            
            return esito;
        }
    che viene utilizzato da un apposito thread ogni minuto.

    Com'è possibile che l'applicazione non si accorga che il thread non è più funzionante ?

  2. #2
    Moderatore di Programmazione L'avatar di LeleFT
    Registrato dal
    Jun 2003
    Messaggi
    17,320
    Tutti quei test guardano a delle proprietà dell'oggetto Socket... proprietà che vengono modificate solo se è l'oggetto Socket a venir modificato. E le modifiche all'oggetto Socket le può fare solo l'applicazione che possiede tale oggetto.

    In particolare:

    1) isConnected() viene impostata a false alla creazione della socket, quindi a true se viene stabilita la connessione e a false se viene chiusa la socket (tramite la chiamata al metodo close()).

    2) isClosed() viene impostato a true se viene chiamato il metodo close()

    3) isBound() viene impostato a true quando la socket viene bindata ad un indirizzo IP

    4) isInputShutdown() e isOutputShutdown() testano rispettivamente se sono stati chiamati i metodi shutdownInput() e shutdownOutput()


    All'altro capo della connessione, c'è un altro oggetto Socket (che nulla ha a che fare con quello che stai testando tu).

    L'unico modo per capire se una connessione è caduta (cioè se dall'altra parte è successo qualcosa) è testare il sollevarsi di eccezioni in fase di lettura/scrittura sugli stream della socket.


    Ciao.
    "Perchè spendere anche solo 5 dollari per un S.O., quando posso averne uno gratis e spendere quei 5 dollari per 5 bottiglie di birra?" [Jon "maddog" Hall]
    Fatti non foste a viver come bruti, ma per seguir virtute e canoscenza

Permessi di invio

  • Non puoi inserire discussioni
  • Non puoi inserire repliche
  • Non puoi inserire allegati
  • Non puoi modificare i tuoi messaggi
  •  
Powered by vBulletin® Version 4.2.1
Copyright © 2025 vBulletin Solutions, Inc. All rights reserved.