Razones oficiales para "El software provocó la interrupción de la conexión: error de escritura en el socket"
Dado este fragmento de seguimiento de pila
Causado por: java.net.SocketException: el software provocó la interrupción de la conexión: error de escritura del socket
en java.net.SocketOutputStream.socketWrite0 (método nativo)
Intenté responder las siguientes preguntas:
- ¿Qué código arroja esta excepción? (¿JVM?/Tomcat?/¿Mi código?)
- ¿Qué causa que se lance esta excepción?
Respecto al número 1:
La fuente JVM de Sun no contiene este mensaje exacto, pero creo que el texto El software provocó la interrupción de la conexión: el error de escritura del socket proviene de la implementación nativa de SocketOutputStream
:
private native void socketWrite0(FileDescriptor fd, byte[] b, int off,
int len) throws IOException;
Respecto al #2
Supongo que se debe a que el cliente finalizó la conexión, antes de recibir la respuesta completa (por ejemplo, envió una solicitud, pero antes de obtener la respuesta completa, se cerró/terminó/se desconectó)
Preguntas:
- ¿Son correctas las suposiciones anteriores (n.° 1 y n.° 2)?
- ¿Se puede diferenciar esto de la situación: "no se pudo escribir en el cliente debido a un error de red en el lado del servidor "? ¿O eso mostraría el mismo mensaje de error?
- Y lo más importante: ¿Existe algún documento oficial (por ejemplo, de Sun) que indique lo anterior?
Necesito tener una prueba de que este seguimiento de la pila es "culpa" del cliente del socket y que el servidor no podría haber hecho nada para evitarlo. (excepto detectar la excepción o usar un SocketOutputStream que no sea Sun JVM, aunque ambos realmente no evitan el hecho de que el cliente haya terminado)
Este error puede ocurrir cuando el sistema de red local cancela una conexión, como cuando WinSock cierra una conexión establecida después de que falla la retransmisión de datos (el receptor nunca reconoce los datos enviados en un socket de flujo de datos).
Consulte este artículo de MSDN . Consulte también información sobre 'El software provocó la interrupción de la conexión' .
He visto esto con mayor frecuencia cuando un firewall corporativo en una estación de trabajo/portátil se interpone en el camino y corta la conexión.
p.ej. Tengo un proceso de servidor y un proceso de cliente en la misma máquina. El servidor está escuchando en todas las interfaces (0.0.0.0) y el cliente intenta conectarse a la interfaz pública/doméstica (tenga en cuenta que no es la interfaz loopback 127.0.0.1).
Si la máquina tiene su red desconectada (por ejemplo, wifi apagada), entonces se forma la conexión. Si la máquina está conectada a la red corporativa (directamente o vpn), se forma la conexión.
Sin embargo, si la máquina está conectada a una wifi pública (o red doméstica), el firewall se activa y corta la conexión. En esta situación, conectar el cliente a la interfaz loopback funciona bien, pero no a la interfaz pública/doméstica.
Espero que esto ayude.