2012-06-05 30 views
28

Ho un'app per Android che comunica con un programma su un PC. Sto usando la classe Socket Android (Java). Se interrompo e riavvio l'app per PC la prossima volta che invio qualcosa da Android, ottengo un'eccezione IO "Broken Pipe". La mia domanda non riguarda questo. Ecco la domanda:Cosa significa esattamente un'eccezione di "tubo rotto" per il socket?

Dopo aver ottenuto l'eccezione tubo rotto se interrogo del Socket isClosed() metodo restituisce false (cioè, non è chiuso), e se mi interrogo del Socket isConnected() metodo che restituisce vero, cioè che è connesso. Qualcuno potrebbe spiegarmi questi risultati? Grazie in anticipo!

+0

http://stackoverflow.com/a/3751722/776244 –

+0

Samir, quel collegamento riguarda l'eccezione di un tubo rotto. Lo capisco già; è per questo che ho detto che la mia domanda non riguarda questo. Voglio capire i valori di ritorno che ottengo dai due metodi Socket. Ho aggiornato il titolo per chiarire questo. – user316117

risposta

18

Tubo rotto significa praticamente esattamente di cosa stai parlando. Il programma da parte tua ha ancora il socket aperto, ma la presa sull'altro lato non è più in comunicazione e non ha seguito la procedura standard "close pipe". Questo può accadere se l'altro lato ha perso il potere all'improvviso, se la linea fisica è stata interrotta, o qualsiasi altra cosa. Come tale, localmente il socket sta registrando sia aperto che connesso - è semplicemente connesso a un tubo rotto. Hai desiderato qualche consiglio pratico qui, o solo la teoria?

+0

Volevo capire la risposta del Socket per scoprire se c'è qualcosa che posso interrogare sul socket per sapere quando ho perso il mio canale di comunicazione e quelli sembravano essere i due metodi più probabili. Questo significa che quando il tubo rompe il primo indizio che avrò è di atterrare nella porzione "cattura" del blocco "try-catch" quando invio qualcosa? – user316117

+0

praticamente. Il punto principale di una pipe rotta è che non è successo nulla a livello locale, e il tuo sistema non è stato informato che stava accadendo quando è successo. –

+0

Ho un re di problemi simili, per favore dai un'occhiata a questo post http://stackoverflow.com/questions/34728935/android-local-video-server – chandil03

1

Socket.isClosed() e Socket.isConnected() ti dico solo quello che si avete fatto alla presa . Non sono lì per dirti qualcosa sullo stato della connessione . Non hai chiuso il socket: è aperto. Hai collegato il socket: è connesso.

Quando si ottiene un IOException operativo a Socket diverso da SocketTimeoutException o un timeout di connessione, è necessario chiudere il socket.

Problemi correlati