Come i socket TCP / IP di Java segnalano il successo o la mancata trasmissione all'applicazione?

Ho un problema con le prese TCP / IP Java: la mia applicazione Java continuerà infinita per submit i dati a un server anche se il server viene distriggersto (senza una corretta connessione TCP / IP) nel frattempo.

Utilizzo il seguente codice per submit i dati:

  • Attendere che smoothScrollToPosition () finisca la listViewView
  • OpenId su Android
  • Memorizzare lo stato della casella di controllo in listview mentre utilizza BaseAdapter personalizzato in android?
  • Questa dipendenza mi dà due versioni di un jar. Come posso risolvere questo problema?
  • Android rendere Google Map all'interno di un frammento
  • Android: tenere l'attività dello stack di attività dopo il riavvio da HOME
  • PrintWriter out = PrintWriter(socket.getOutputStream(), true); out.write("text"); if (out.checkError()) { System.err.println("Error sending string!"); } 

    In un'altra domanda su overflow di stack , ho trovato la seguente risposta:

    TCP / IP (e per questo java sockets) garantirà di submit con successo i dati o get un errore (exception nel caso del java) alla fine.

    Il mio codice è sufficiente per essere informato sullo stack TCP / IP non essere in grado di submit la mia string o devo fare qualcosa di più?

    Btw: era corretto aprire una nuova domanda anche se l'altra domanda era simile? Non ha risposto alla mia domanda in modo soddisfacente e ho solo potuto aggiungere una nuova risposta, non un nuovo commento.

  • android - La chiamata richiede l'API livello 9 (attuale min è 8): android.os.StrictMode # setThreadPolicy
  • Come copiare il text in Clip Board in Android?
  • Biometria vocale per Android
  • Caricare un file di grandi size in multipart utilizzando OkHttp
  • Ottieni il path reale da URI, Android KitKat nuovo framework di accesso allo storage
  • MMS in android non funzionante utilizzando Intent.ACTION_SEND
  • 5 Solutions collect form web for “Come i socket TCP / IP di Java segnalano il successo o la mancata trasmissione all'applicazione?”

    Potresti avere due problemi: PrintWriter è una bestia strana nel mondo Java Stream / Reader / Writer in quanto inibisce le eccezioni e richiede di verificare esplicitamente gli errori.

    L'unico uso per questo (a mio parere) sono i flussi standard ( System.out e System.err ), in cui l'errore di scrittura di output non dovrebbe fermare l'applicazione (ad esempio se non è disponibile un'output standard).

    Sostituirlo con un OutputStreamWriter e sarai informato sugli errori non appena Java lo conosce.

    Questo mi port al secondo problema ansible: TCP / IP non dispone di pacchetti mantenuti automatici: quindi se la connessione viene interrotta in qualche modo, non lo noterai finché non tenterai di submit i dati.

    Quindi, se si connette a qualche socket, submit alcuni pacchetti, attendere un po 'e quindi scollegarsi, verrà notificato solo quando si tenta di submit alcuni dati. Questo è inerente al protocollo TCP / IP e non a colpa di Java.

    Se si desidera ridurre il problema, è ansible submit messaggi periodicamente keep-alive / ping senza alcun effetto effettivo, eccetto che controllano se la connessione è ancora viva.

    La tua domanda è diversa da dire. Google ha molto da dire su questo genere di cose però. I mantenitori ( SO_KEEPALIVE ) non sono progettati per questo tipo di cose. Da quello che ho letto la specifica TCP dice che non dovrebbe essere inviato più di una volta each due ore e è al tuo sistema operativo per gestirlo in modo da non avere molto controllo. Sottolineo da quello che ho letto .

    Sia che tu possa utilizzarli più di una volta each due ore non import nel tuo caso anche perché tu continuamente invia i dati. Keep-alives sono necessari solo se si desidera rilevare una connessione interrotta durante l'invio di dati.

    Se si usava direttamente l' OutputStream del Socket , si lancia un'exception quando si tenta di submit a una destinazione non disponibile (per qualunque motivo che potrebbe essere). Poiché si utilizza PrintWriter , è necessario verificare manualmente gli errori usando checkError() .

    Quindi, in sintesi: Sì, è sufficiente per il tuo scopo.

    Quello che non ho citato (come ho pensato che non era rilevante in quel momento) è che sto cercando di farlo su Android.

    Dopo diverse settimane di test, tuttavia, sembra che l'implementazione di Android delle classi di network Java standard si comporti in maniera molto diversa rispetto all'Oracle JRE. Su Android, è apparentemente imansible rilevare in modo affidabile se la connessione è stata chiusa, anche se l'ho chiusa. [Stream].write() cercherà di scrivere per alcuni minuti. Così su Android, sembra che dovrai sempre submit i propri mantenitori (e controllare la ricezione!) Per rilevare una connessione interrotta.

    Le altre risposte a questa domanda funzionano bene con l'Oracle JRE. Grazie ancora!

    Se qualcuno può fornire ulteriori informazioni su questo argomento, per favore fai così.

    A volte anche se il server è morto, l'applicazione client non è informata. Di solito questo è un router che non riesce a chiudere entrambi i lati della connessione. È necessario impostare i mantenitori in modo da poter rilevare questo tipo di guasto.

    A seconda del sistema operativo esistono modi per modificare l'intervallo di prova mantenuto in vita.

    Una condizione speciale si applica quando si sta chiudendo la presa. A seconda SO_LINGER (vedere questo articolo ) impostata, la chiamata close() ritornerà immediatamente o attendere che tutte le trasmissioni TCP in sospeso siano state eseguite o si è verificato un errore, che viene quindi segnalato da un IOException lanciato dalla close() .

    Anche SO_TIMEOUT ha un effetto quando i tentativi SO_TIMEOUT .

    L'Android è un fan Android di Google, tutto su telefoni Android, Android Wear, Android Dev e applicazioni Android Games e così via.