Visualizzazione dei risultati da 1 a 7 su 7
  1. #1

    socket.close() e IOException

    Ciao a tutti,
    mi stavo chiedendo qual'e' il miglior modo di gestire un eventuale IOException lanciata dal
    metodo close() delle classe Socket e SocketChannel.
    Prima cosa non riesco a capire in che occasioni puo' avvenire l'eccezione; secondo poi di solito quello che faccio e' semplicemente lasciare il blocco catch vuoto ed ignorare l'eccezione, ma temo che non sia il modo piu corretto di gestirla.

    grazie.
    MB

  2. #2
    sembra che l'escusivita del socket venga gestita tramite un file (di lock immagin0) e nel caso ci siano problemi di scrittura demandi l'eccezione al chiamante....

    (e per rispondere alla domanda)...questa è una tipologia di gestione dell'eccezione...cioè: non gestirla e demanda il tutto al chiamante....


    ....sencondo me, in generale l'eccezione non va MAI droppata, in quanto, se c'è una eccezione, significa che qualcosa è andato storto....e bisogna saperlo....una soluzione potrebbe essere la creazione di una propria classe che gestiche l'eccezione MyExc che estende Exception, poi in OGNI catch fare un thorw a MyExc, questo ti permette di canalizzare le eccezioni e gestirle in una unica classe
    (questo, ovviamente, va bene nel caso in qui non bisogna fare una effettiva gestione dell'errore ma solo una gestione informativa)

    personalmente io le gestisco demandando al chiamante....sarà poi lui a gestirla: demandandola a sua volta se puo, o gestendola con un MyExc....e così via)....ho notato (esperienza personale) che portare l'eccezione il più in alto possibile porta solo benefici....

    Cià!

  3. #3
    grazie della risposta.

    sono pienamente d'accordo su tutto cio' che hai scritto. Ed e' anche la linea che seguo io (portare le eccezioni il piu in altro possibile e mai ignorarle).
    Il fatto e' che nel mio programma l'utente puo' editare diverse tab connettendosi ad un server ed ogni tab crea una connessione con lo stesso. Adesso i casi in cui chiudo un socket sono:

    1) la connessione va giu' e in questo caso, nel blocco catch della IOException generata, informo l'utente, avvio una procedura di recovery e chiudo il socket.
    2) l'utente chiude il tab e in questo caso chiudo il socket.

    Come vedi non c'e' niente che possa fare perche il socket chiuso e' esclusivo per quel tab quindi non devo preoccuparmi di altri accessi e, in entrambi i casi, l'utente e' gia consapevole che quella connessione non verra' piu utilizzata. Un messaggio del tipo "non sono riuscito a chiudere il socket" non avrebbe senso per lui.

  4. #4
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    questa eccezione da quale lato ce l'hai?
    Mi spiego, il socket lo apri tra A e B, su A fai close e poi?
    Se il canale è ancora aperto dall'altro lato arriva un'eccezione dovuta alla chiusura del socket (non sa come dire che all'altro capo non c'è nessuno).

  5. #5
    Si. Il server e' un semplice broadcaster, quindi quando avviene l'eccezione non fa altro che rimuovere il socket da una lista di socket a cui mandare in broadcast tutti i messaggi che riceve dai client.

    L'eccezione di cui parli tu dovrebbe accadere quando il server cerca di scrivere o leggere sul canale (quando legge ottiene -1 come numero di byte letti in realta')

    Non e' che mi piaccia molto come tecnica in realta'. potrei fare come nel protocollo ftp dove il client prima di disconnettersi mada un comando "QUIT" che fa si che la connessione venga chiusa dal server prima di chiuderla anche nel client.
    Comunque invocando la close() a livello TCP dovrebbe avviare la chiusura della connessione, quindi penso lo potremmo considerare relativamente pulito come sistema.

    tu che ne pensi ?

  6. #6
    Utente di HTML.it
    Registrato dal
    Feb 2007
    Messaggi
    4,157
    in realtà quella eccezione la puoi ignorare (come ho visto fare in parecchi casi), anche se come ti dicevano non è buona norma.
    Per fare qualcosa di più pulito manda il mex di quit (in questo caso sei certo della chiusura) oppure fai come hanno fatto qui che mi sembra buona anche come soluzione.

  7. #7
    thanks


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.