/ / Motifs officiels pour “Abandon de la connexion causé par un logiciel: erreur d’écriture de socket” - java, exception, sockets, tomcat, stack-trace

Raisons officielles pour «interruption de connexion provoquée par un logiciel: erreur d’écriture de socket» - java, exception, sockets, tomcat, stack-trace

Étant donné cet extrait de trace de pile

Causé par: java.net.SocketException: Le logiciel a provoqué la déconnexion: erreur d'écriture de socket
à java.net.SocketOutputStream.socketWrite0 (Native Méthode)

J'ai essayé de répondre aux questions suivantes:

  1. Quel code lance cette exception? (JVM? / Tomcat? / Mon code?)
  2. Qu'est-ce qui provoque cette exception?

Concernant # 1:

La "source JVM de Sun" ne contient pas ce message exact, mais je pense que le texte Abandon de la connexion causé par le logiciel: erreur d'écriture du socket est de la mise en œuvre native de SocketOutputStream:

private native void socketWrite0(FileDescriptor fd, byte[] b, int off,
int len) throws IOException;

En ce qui concerne # 2

Je suppose que cela est causé lorsque le client aa mis fin à la connexion, avant d’obtenir la réponse complète (par exemple, une demande, mais avant d’obtenir la réponse complète, elle a été fermée / terminée / hors ligne)

Des questions:

  1. Les hypothèses ci-dessus sont-elles correctes (n ° 1 et n ° 2)?
  2. Est-ce que cela peut être différencié de la situation: "impossible d'écrire sur le client, en raison d'une erreur réseau survenue serveur côté "? ou cela rendrait le même message d'erreur?
  3. Et le plus important: Existe-t-il un document officiel (de Sun, par exemple) mentionnant ce qui précède?

J'ai besoin d'une preuve que cette trace de pile estle client de socket "s" faute ", et le serveur n’aurait rien pu faire pour l’éviter (excepté la capture de l’exception ou l’utilisation d’un SocketOutputStream autre que JVM de Sun, bien que les deux n’évitent pas vraiment le fait que le client est terminé )

Réponses:

47 pour la réponse № 1

"Cette erreur peut survenir lorsque le réseau localle système interrompt une connexion, par exemple lorsque WinSock ferme une connexion établie après l'échec de la retransmission des données (le destinataire ne reconnaît jamais les données envoyées sur un socket datastream). cet article MSDN. Voir également Quelques informations sur "Abandon de la connexion causée par un logiciel".


9 pour la réponse № 2

C'est ce que j'ai vu le plus souvent lorsqu'un pare-feu d'entreprise sur un poste de travail / un ordinateur portable gêne la connexion.

par exemple. J'ai un processus serveur et un processus client sur le même ordinateur. Le serveur est à l'écoute de toutes les interfaces (0.0.0.0) et le client tente une connexion à l'interface publique / domestique (notez pas l'interface de bouclage 127.0.0.1).

Si le réseau de la machine est déconnecté (par exemple, le wifi est désactivé), la connexion est établie. Si la machine est connectée au réseau d'entreprise (directement ou par vpn), la connexion est établie.

Cependant, si la machine est connectée à un ordinateur publicWi-Fi (ou réseau domestique), le pare-feu démarre et tue la connexion. Dans cette situation, la connexion du client à l'interface de bouclage fonctionne correctement, mais pas à l'interface home / publique.

J'espère que cela t'aides.


4 pour la réponse № 3

Pour prouver quel composant échoue, je surveillerais la communication TCP / IP à Wirehark et regardez qui ferme effectivement le port, les délais d'attente pourraient également être pertinents.


3 pour la réponse № 4

le java.net.SocketException est renvoyé en cas d'erreur de création ou d'accès une prise de courant (tel que TCP). Cela peut généralement se produire lorsque le serveur a mis fin à la connexion (sans la fermer correctement), donc avant d'obtenir la réponse complète. Dans la plupart des cas, cela peut être causé par le problème de délai (par exemple, la réponse prend trop de temps ou le serveur est surchargé de requêtes), ou le client a envoyé le SYN, mais il n’a pas reçu ACK (accusé de réception de la connexion) Pour les problèmes de délai d'attente, vous pouvez augmenter la valeur du délai d'attente.

L'exception de socket vient généralement avec le message de détail spécifié concernant le problème.

Exemple de messages détaillés:

  • Le logiciel a provoqué l'abandon de la connexion: échec de recv.

    L'erreur indique une tentative d'envoi du message et la connexion a été interrompue par votre serveur. Si cela se produit lors de la connexion à la base de données, cela peut être lié à l'utilisation de Pilote Connector / J JDBC non compatible.

    Solution possible: Assurez-vous de disposer des bibliothèques / pilotes appropriés dans votre CLASSPATH.

  • Le logiciel a causé une interruption de la connexion: connectez-vous.

    Cela peut arriver lorsqu'il y a un problème de connexion à la télécommande. Par exemple à cause d'un virus vérifiant les demandes de courrier à distance.

    Solution possible: vérifiez si le service d’analyse antivirus bloque le port des demandes de connexion sortantes.

  • Abandon de la connexion causé par le logiciel: erreur d’écriture du socket.

    Solution possible: Assurez-vous que vous écrivez la longueur correcte en octets dans le flux. Vérifiez donc ce que vous envoyez. Regarde ça fil.

  • Connexion réinitialisée par un homologue: erreur d'écriture de socket / Connexion interrompue par un homologue: erreur d'écriture de socket

    L'application n'a pas vérifié si la connexion persistante avait expiré côté serveur.

    Solution possible: Assurez-vous que HttpClient est non nul avant de lire la connexion.E13222_01

  • Réinitialisation de la connexion par paire.

    La connexion a été terminée par l'homologue (serveur).

  • Connexion réinitialisée.

    La connexion a été interrompue par le client ou fermée par l'extrémité serveur de la connexion en raison d'une requête avec la requête.

    Voir: Quelle est la cause de ma java.net.SocketException: réinitialisation de la connexion?


2 pour la réponse № 5

Avez-vous vérifié le code source de Tomcat et la source JVM? Cela peut vous donner plus d'aide.

Je pense que votre pensée générale est bonne. Je m'attendrais à ConnectException dans le cas où vous ne pourriez pas vous connecter. Ce qui est décrit ci-dessus ressemble beaucoup à un client.


2 pour la réponse № 6

Pour ceux qui utilisent de simples programmes Client Server et obtiennent cette erreur, il s’agit d’un problème de flux d’entrée ou de sortie non fermés (ou fermés au plus tôt).


1 pour la réponse № 7

Je faisais face au même problème.
Généralement, ce type d'erreur se produit parce que le client a fermé sa connexion et que le serveur tente toujours d'écrire sur ce client.
Assurez-vous donc que la connexion de votre client est ouverte jusqu'au serveur avec son flux de sortie.
Et encore une chose, n’oubliez pas de fermer le flux d'entrée et de sortie.

J'espère que cela t'aides.
Et si le problème persiste, résumez votre problème ici en détail.


0 pour la réponse № 8

Cette erreur m’est arrivée lors du test de mon service soap avec le client SoapUI. En fait, j’essayais de recevoir un très gros message (> 500 Ko) et SoapUI a mis fin à la connexion.

Sur SoapUI, allez à:

Fichier -> Préférences - Socket Timeout (ms)

... et mettez une valeur élevée, telle que 180000 (3 minutes), cela ne constituera pas la solution idéale à votre problème, car le fichier est trop volumineux, mais vous aurez au moins une réponse.


0 pour la réponse № 9

Dans mon cas, l'erreur était:

java.net.SocketException: Software caused connection abort: recv failed

Il a été reçu en éclipse lors du débogage d'un javaapplication 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é l'indicateur pour activer plusieurs connexions à la même base de données (c'est-à-dire AUTO_SERVER=TRUE), il n’ya donc pas eu de problème de connexion à la base de données à partir de Java.

L’erreur est apparue quand, après un moment - c’est unlong processus java - j'ai décidé de fermer SQuirreL pour libérer des ressources. Il semble que SQuirreL soit celui qui "possède" l'instance du serveur de base de données et qu'il a été arrêté avec la connexion SQuirreL.

Le redémarrage de l'application Java n'a pas généré l'erreur à nouveau.

config

  • Windows 7
  • Eclipse Kepler
  • SQuirreL 3.6
  • org.h2.Driver ver 1.4.192

-1 pour la réponse № 10

Mon serveur lançait cette exception deux jours plus tard et je l’ai résolue en déplaçant la fonction de déconnexion avec:

outputStream.close();
inputStream.close();
Client.close();

À la fin du fil de liste. si cela peut aider quelqu'un.


-1 pour la réponse № 11

Dans la situation décrite ci-dessous, le côté client lève une telle exception:

Le serveur est invité à authentifier le clientcertificat, mais le client fournit un certificat pour lequel l'utilisation de la clé étendue ne prend pas en charge l'authentification du client; le serveur n'accepte donc pas le certificat du client, puis ferme la connexion.


-3 pour la réponse № 12

Je faisais face au même problème avec wireMock lorsque je me moquais des appels API restants. Auparavant, je définissais le serveur comme suit:

WireMockServer wireMockServer = null;

Mais il devrait être défini comme ci-dessous:

@Rule
public WireMockRule wireMockRule = new WireMockRule(8089);