Étant donné cet extrait de trace de pile
Causé par : java.net.SocketException : Le logiciel a provoqué l'abandon de la connexion : erreur d'écriture de la socket
à l'adresse java.net.SocketOutputStream.socketWrite0(Méthode native méthode)
J'ai essayé de répondre aux questions suivantes :
- Quel code génère cette exception ? (JVM?/Tomcat?/Mon code ?)
- Qu'est-ce qui provoque l'apparition de cette exception ?
Concernant le numéro 1 :
La source de la JVM de Sun ne contient pas ce message exact, mais je pense que le texte Le logiciel a provoqué l'abandon de la connexion : erreur d'écriture de la prise provient de l'implémentation native de SocketOutputStream
:
private native void socketWrite0(FileDescriptor fd, byte[] b, int off,
int len) throws IOException;
Concernant le point 2
Je pense que cela se produit lorsque le client a mis fin à la connexion avant d'avoir obtenu la réponse complète (par exemple, il a envoyé une demande, mais avant d'obtenir la réponse complète, la connexion a été fermée/terminée/hors ligne).
Questions :
- Les hypothèses ci-dessus sont-elles correctes (#1 et #2) ?
- Peut-on différencier cela de la situation : "Impossible d'écrire au client, en raison d'une erreur de réseau sur le serveur ou cela donnerait-il le même message d'erreur ?
- Et le plus important : Existe-t-il un document officiel (par exemple de Sun) indiquant ce qui précède ?
J'ai besoin d'avoir une preuve que cette trace de pile est la "faute" du client de socket, et il n'y a rien que le serveur aurait pu faire pour l'éviter. (sauf attraper l'exception, ou utiliser un SocketOutputStream non Sun JVM, bien que les deux n'évitent pas vraiment le fait que le client se soit terminé).
0 votes
Je rencontre ce problème lorsque j'annule un téléchargement avec Firefox.
0 votes
Hé Eran, j'obtiens également cette exception lors de l'envoi/écriture (
outs.write(audioBytes);
)byte[]
àOutputStream
. Lorsque l'audio est en cours de diffusion, si l'utilisateur clique sur un autre menu (ce qui envoie une requête au serveur), j'obtiens la même erreur sur la console. est-il possible d'ignorer cette exception ?1 votes
@Amogh - Il semble que oui. D'après ce que les réponses décrivent, il s'agit d'une erreur spécifique à Windows, mais je suppose que sous Linux, vous obtiendrez la même exception, mais avec une formulation différente... (Ma compréhension en termes de profanes est que cela est causé par un envoi via un socket à un emplacement distant X et que X a été déconnecté au milieu, mais je suis sûr que ce n'est pas la façon la plus précise de le décrire).
1 votes
Pour moi, cela s'est produit lorsque le serveur de la base de données a été redémarré et que l'application essayait toujours d'effectuer des requêtes en utilisant des connexions précédemment ouvertes. Je ne sais pas pourquoi celles-ci n'ont pas été rafraîchies, car nous utilisons un pooling basé sur DBCP. Mais le redémarrage de l'application a réglé le problème.