Raisons officielles pour " le logiciel a causé l'interruption de la connexion: erreur d'écriture de socket"
étant donné cet extrait de la pile
causé par: java.net.SocketException: Le logiciel a causé l'interruption de la connexion: erreur d'écriture de socket
à java.net.SocketOutputStream.socketWrite0 (natif La méthode du
j'ai essayé de répondre aux questions suivantes:
- quel code jette cette exception? (JVM?- Tomcat?/Mon code?)
- Qu'est-ce qui fait que cette exception soit jetée?
concernant #1:
Source JVM de Sun ne contient pas ce message exact, mais je pense que le texte logiciel causé la connexion avorter: erreur d'écriture socket est de la mise en œuvre native de SocketOutputStream
:
private native void socketWrite0(FileDescriptor fd, byte[] b, int off,
int len) throws IOException;
concernant # 2
à mon avis, il est causé lorsque le client a terminé la connexion, avant d'obtenir la réponse complète (par exemple envoyé une demande, mais avant d'obtenir la réponse complète, il a été fermé / terminé / hors ligne)
Questions:
- les hypothèses ci-dessus sont-elles correctes (nos 1 et 2)?
- peut-il être différencié de la situation: "ne pouvait pas écrire au client, dû à une erreur réseau sur le serveur côté"? ou est-ce que cela donnerait le même message d'erreur?
- Et le plus important: Est-il un document officiel (e.g du Soleil), en indiquant ci-dessus?
j'ai besoin d'une preuve que cette trace de pile est la "faute" du client socket, et il n'y a rien que le serveur aurait pu faire pour l'éviter. (sauf exception, ou en utilisant un JVM non Sun SocketOutputStream, bien que les deux n'évitent pas vraiment le fait que le client a terminé)
12 réponses
" cette erreur peut se produire lorsque le système de réseau local interrompt une connexion, par exemple lorsque WinSock ferme une connexion établie après une défaillance de retransmission de données (le récepteur ne reconnaît jamais les données envoyées sur une socket de transmission de données).". Voir cet article du MSDN . Voir aussi certaines informations sur" le logiciel a causé la connexion avorter " .
j'ai vu cela le plus souvent quand un pare-feu d'entreprise sur un poste de travail/ordinateur portable se met en travers, il tue la connexion.
par exemple. J'ai un serveur et un client processus sur la même machine. Le serveur écoute sur toutes les interfaces (0.0.0.0) et le client tente une connexion à l'interface public/home (notez pas l'interface loopback 127.0.0.1).
si la machine a son réseau déconnecté (par exemple wifi éteint) alors le la connexion est formée. Si la machine est connectée au réseau d'entreprise (directement ou vpn) alors la connexion est formée.
cependant, si la machine est connectée à un réseau wifi public (ou réseau domestique) alors le pare-feu déclenche dans un tue la connexion. Dans cette situation, connecter le client à l'interface de loopback fonctionne très bien, mais pas à l'interface home/public.
Espérons que cette aide.
le java.net.SocketException
est lancé lorsqu'il y a une erreur créant ou accédant à une socket (tel que TCP ). Cela peut généralement être causé lorsque le serveur a terminé la connexion (sans la fermer correctement), donc avant d'obtenir la réponse complète. Dans la plupart des cas, cela peut être causé soit par le problème de timeout (par exemple, la réponse prend trop de temps ou le serveur est surchargé avec les requêtes), soit par le client qui a envoyé la requête. SYN, mais il n'a pas reçu ACK (reconnaissance de la fin de la connexion). Pour les problèmes de timeout, vous pouvez envisager d'augmenter la valeur de timeout.
L'Exception de Socket vient généralement avec le message de détail spécifié au sujet de la question.
exemple de messages détaillés:
-
Logiciel a provoqué l'abandon de la connexion: recv a échoué.
l'erreur indique une tentative d'envoyer le message et la connexion ont été interrompues par votre serveur. Si cela s'est produit lors de la connexion à la base de données, cela peut être lié à l'utilisation de connecteur non compatible/j pilote JDBC .
solution Possible: assurez-vous d'avoir les bibliothèques/pilotes appropriés dans votre CLASSEPATH.
-
Logiciel a provoqué l'abandon de la connexion: connexion.
This peut se produire lorsqu'il y a un problème de connexion à la télécommande. Par exemple en raison du virus-checker rejetant les requêtes de courrier à distance .
solution Possible: vérifiez si le service Virus scan bloque le port pour les demandes de connexion sortantes.
-
Logiciel a provoqué l'abandon de la connexion: prise d'erreur d'écriture.
solution Possible: s'assurer vous écrivez la bonne longueur d'octets au flux. Alors vérifiez ce que vous envoyez. Voir ce thread .
-
réinitialisation de la connexion par peer: erreur d'écriture de socket / connexion interrompue par peer: erreur d'écriture de socket
l'application n'a pas vérifié si la connexion keep-alive avait été programmée du côté du serveur.
solution Possible: assurer que le HttpClient n'est pas nul avant la lecture de la connexion. E13222_01
-
connexion réinitialisée par peer.
la connexion a été interrompue par le peer (serveur).
-
Réinitialisation de la connexion
.
La connexion a été terminé par le client ou fermé par le serveur fin de la connexion due à la requête avec la requête.
Voir: Quelle est la cause de mon java.net.Exception socketexception: Connection reset?
avez-vous vérifié le code source Tomcat et le code source JVM ? Qui peut vous donner plus d'aide.
je pense que votre pensée générale est bonne. Je m'attendais à un ConnectException
dans le scénario où vous ne pouviez pas vous connecter. Ce qui précède semble très axé sur le client.
pour n'importe qui utilisant des programmes de Serveur Client simples et obtenant cette erreur, c'est un problème de flux D'entrée ou de sortie non clos (ou fermé au début).
je faisais face à la même question.
Généralement ce genre d'erreur se produit en raison du client a fermé sa connexion et le serveur essaye toujours d'écrire sur ce client.
Assurez-vous donc que votre client a sa connexion ouverte jusqu'à ce que le serveur ait terminé son outputstream.
Et encore une chose, N'oubliez pas de fermer le flux d'entrée et de sortie.
Espérons que cette aide.
Et si encore confrontés à la question que brièvement votre problème ici dans les détails.
cette erreur m'est arrivée alors que je testais mon service soap avec SoapUI client, fondamentalement j'essayais d'obtenir un très grand message (>500kb) et SoapUI fermé la connexion par timeout.
sur SoapUI aller à:
Fichier-->Préférences--Socket Délai(ms)
...et mettez une grande valeur, comme 180000 (3 minutes), ce ne sera pas la solution parfaite pour votre problème parce que le fichier est en fait grand, mais au moins vous aurez une réponse.
connexion fermée chez un autre client
Dans mon cas, l'erreur était:
java.net.SocketException: Software caused connection abort: recv failed
il a été reçu en eclipse lors du débogage d'une application java accédant à une base de données H2. La source de l'erreur était que j'avais initialement ouvert la base de données avec SQuirreL pour vérifier manuellement l'intégrité. J'ai utilisé le drapeau pour activer plusieurs connexions à la même base de données (i.e. AUTO_SERVER=TRUE
), donc il n'y avait aucun problème de connexion à la base de données depuis java.
l'erreur est apparue quand, après un certain temps --c'est un long processus java-- j'ai décidé de fermer SQuirreL aux ressources libres. Il semble que SQuirreL soit celui qui "possède" L'instance du serveur DB et qu'elle ait été désactivée avec la connexion SQuirreL.
redémarrer L'application Java n'a pas produit l'erreur à nouveau.
config
- Windows 7
- Eclipse Kepler
- Écureuil 3.6
- org.h2.Driver ver 1.4.192
mon serveur lançait cette exception dans le pass 2 jours et je l'ai résolu en déplaçant la fonction de déconnexion avec:
outputStream.close();
inputStream.close();
Client.close();
À la fin de la liste thread. si il sera aidé quelqu'un.
dans la situation expliquée ci-dessous, le client fera une telle exception:
le serveur est invité à authentifier le certificat client, mais le client fournit un certificat dont L'utilisation de la clé étendue ne supporte pas le client auth, de sorte que le serveur n'accepte pas le certificat client, puis il ferme la connexion.
j'étais confronté au même problème avec wireMock tout en me moquant des appels de L'API rest. Plus tôt, je définissais le serveur comme ceci:
WireMockServer wireMockServer = null;
mais il doit être défini comme suit:
@Rule
public WireMockRule wireMockRule = new WireMockRule(8089);