La palabra clave aquí (without closing the socket properly)
.
sockets siempre se deben adquirir y eliminar de esta manera:
final Socket socket = ...; // connect code
try
{
use(socket); // use socket
}
finally
{
socket.close(); // dispose
}
Incluso con esta precauciones que debe especificar tiempos de aplicación, específicos de su protocolo.
Mi experiencia ha demostrado que, desafortunadamente, no puede usar ninguna de las funciones de tiempo de espera de manera confiable (por ejemplo, no hay tiempo de espera para las operaciones de escritura e incluso las operaciones de lectura pueden colgarse para siempre).
Es por eso que necesita un hilo de vigilancia que hace cumplir los tiempos de espera de la aplicación y dispone de enchufes que no han respondido por un tiempo.
Una manera conveniente de hacerlo es inicializando Socket y ServerSocket a través de los canales correspondientes en java.nio. La principal ventaja de estos zócalos es que son interruptores interrumpibles, de esa manera puede simplemente interrumpir el hilo que hace el protocolo de zócalo y asegurarse de que el zócalo se deseche correctamente.
Tenga en cuenta que debe exigir el tiempo de espera de las aplicaciones en ambos lados, ya que es solo una cuestión de tiempo y mala suerte cuando puede experimentar sockets que no responden.
Ya traté de usarlo escribiendo en el socket e incluso entonces no sé si el cliente se ha desconectado. – erotsppa