La parola chiave qui (without closing the socket properly)
.
Sockets dovrebbero essere sempre acquisite e trasferite in questo modo:
final Socket socket = ...; // connect code
try
{
use(socket); // use socket
}
finally
{
socket.close(); // dispose
}
anche con questo precauzioni è necessario specificare i timeout di applicazioni, specifiche per il protocollo.
La mia esperienza ha dimostrato, che purtroppo non è possibile utilizzare nessuna delle funzionalità timeout Socket affidabile (ad esempio non v'è alcun timeout per le operazioni di scrittura e anche leggere le operazioni possono, a volte, appendere per sempre).
Ecco perché è necessario un thread di controllo che applica i timeout dell'applicazione e dispone di socket che non rispondono per un po '.
Un modo conveniente per farlo è inizializzando Socket e ServerSocket tramite i canali corrispondenti in java.nio. Il vantaggio principale di tali socket è che sono interrompibili, in questo modo è possibile semplicemente interrompere il thread che esegue il protocollo socket e assicurarsi che il socket sia correttamente eliminato.
Si noti che è necessario imporre il timeout dell'applicazione su entrambi i lati, in quanto è solo una questione di tempo e sfortuna in cui si potrebbero verificare socket non responsivi.
fonte
2010-06-30 00:03:53
Ho già provato ad usarlo scrivendo sul socket e anche in questo caso non so se il client è disconnesso. – erotsppa