Étant donné cet extrait de trace de pile
Provoqué par: java.net.SocketException: le logiciel a provoqué l'abandon de la connexion: erreur d'écriture de socket
sur java.net.SocketOutputStream.socketWrite0 (méthode native)
J'ai essayé de répondre aux questions suivantes:
- Quel code lève cette exception? (JVM? / Tomcat? / Mon code?)
- Qu'est-ce qui provoque la levée de cette exception?
Concernant le n ° 1:
La source JVM de Sun ne contient pas ce message exact, mais je pense que le texte Software a causé l'abandon de la connexion: l'erreur d'écriture de socket provient de l'implémentation native de SocketOutputStream
:
private native void socketWrite0(FileDescriptor fd, byte[] b, int off,
int len) throws IOException;
Concernant # 2
Je suppose que cela est causé lorsque le client a mis fin à la connexion, avant d'obtenir la réponse complète (par exemple, a envoyé une demande, mais avant d'obtenir la réponse complète, elle a été fermée / terminée / hors ligne)
Des questions:
- Les hypothèses ci-dessus sont-elles correctes (n ° 1 et n ° 2)?
- Cela peut-il être différent de la situation: "impossible d'écrire sur le client en raison d'une erreur réseau côté serveur "? ou cela rendrait-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'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 pour attraper l'exception, ou en utilisant un SocketOutputStream non Sun JVM, bien que les deux n'évitent pas vraiment le fait que le client s'est arrêté)
outs.write(audioBytes);
)byte[]
àOutputStream
. Lorsque l'audio s'exécute et pendant la lecture si l'utilisateur clique sur un autre menu (qui envoie une requête au serveur), j'ai eu la même erreur sur la console. alors est-il prudent d'ignorer cette exception?Réponses:
Consultez cet article MSDN . Voir aussi Quelques informations sur «Le logiciel a provoqué l'interruption de la connexion» .
la source
Le
java.net.SocketException
est émis lorsqu'il y a une erreur lors de la création ou de l'accès à un socket (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é soit par le problème du délai d'attente (par exemple, la réponse prend trop de temps ou le serveur est surchargé avec les demandes), soit par le client a envoyé le SYN, mais il n'a pas reçu ACK (accusé de réception de la fin de la connexion) . Pour les problèmes de délai d'expiration, vous pouvez envisager d'augmenter la valeur du délai d'expiration.L'exception de socket est généralement accompagnée du message de détail spécifié sur le problème.
Exemple de messages détaillés:
L'erreur indique une tentative d'envoi du message et la connexion a été interrompue par votre serveur. Si cela s'est produit lors de la connexion à la base de données, cela peut être lié à l'utilisation d'un pilote JDBC Connector / J non compatible .
Solution possible: assurez-vous d'avoir les bibliothèques / pilotes appropriés dans votre CLASSPATH.
Cela 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 demandes de courrier distant .
Solution possible: vérifiez si le service d'analyse antivirus bloque le port pour les demandes de connexions sortantes.
Solution possible: assurez-vous que vous écrivez la bonne longueur d'octets dans le flux. Vérifiez donc ce que vous envoyez. Voir ce fil .
L'application n'a pas vérifié si la connexion persistante avait expiré du côté serveur.
Solution possible: assurez-vous que HttpClient est non nul avant de lire à partir de la connexion. E13222_01
La connexion a été interrompue par le pair (serveur).
La connexion a été interrompue par le client ou fermée par l'extrémité serveur de la connexion en raison de la demande avec la demande.
Voir: Qu'est-ce qui cause mon java.net.SocketException: réinitialisation de la connexion?
la source
HttpClient
êtrenull
ne peut pas provoquer deSocketException
. Ne pas écrire la longueur correcte dans le flux non plus.J'ai vu cela le plus souvent lorsqu'un pare-feu d'entreprise sur un poste de travail / ordinateur portable gêne la connexion.
par exemple. J'ai un processus serveur et un processus client 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 de bouclage 127.0.0.1).
Si la machine a son réseau 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 VPN), la connexion est établie.
Cependant, si la machine est connectée à un wifi public (ou à un réseau domestique), le pare-feu déclenche la connexion. Dans cette situation, la connexion du client à l'interface de bouclage fonctionne correctement, mais pas à l'interface home / public.
J'espère que cela t'aides.
la source
Pour prouver quel composant échoue, je surveillerais la communication TCP / IP à l'aide de WireShark et regarderais qui ferme effectivement le port, des délais d'expiration pourraient également être pertinents.
la source
Avez-vous vérifié le code source Tomcat et la source JVM? Cela peut vous aider davantage.
Je pense que votre réflexion générale est bonne. Je m'attendrais
ConnectException
à ce que vous ne puissiez pas vous connecter dans le scénario. Ce qui précède semble très axé sur le client.la source
Pour quiconque utilise de simples programmes client-serveur et obtient cette erreur, il s'agit d'un problème de flux d'entrée ou de sortie non fermés (ou fermés au début).
la source
J'étais confronté 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 essaie toujours d'écrire sur ce client.
Assurez-vous donc que votre client a sa connexion ouverte jusqu'à ce que le serveur ait terminé avec son flux de sortie.
Et encore une chose, n'oubliez pas de fermer les flux d'entrée et de sortie.
J'espère que cela t'aides.
Et si le problème persiste, informez-en votre problème ici en détail.
la source
Cette erreur m'est arrivée lors du test de mon service soap avec le client SoapUI, en gros, j'essayais d'obtenir un très gros message (> 500kb) et SoapUI a fermé la connexion par timeout.
... et mettez une valeur élevée, telle que 180000 (3 minutes), ce ne sera pas la solution idéale pour votre problème car le fichier est en fait trop volumineux, mais au moins vous aurez une réponse.
la source
Connexion fermée dans un autre client
Dans mon cas, l'erreur était:
Il a été reçu dans 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 (c.-à-d.
AUTO_SERVER=TRUE
), il n'y a donc pas eu de 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 pour libérer des ressources. Il semble que SQuirreL était celui qui «possédait» l'instance de serveur de base de données et qu'il avait été arrêté avec la connexion SQuirreL.
Le redémarrage de l'application Java n'a pas renvoyé l'erreur.
config
la source
Dans mon cas, j'ai développé le côté client et côté serveur, et j'ai l'exception:
lorsque les classes du client et du serveur sont différentes. Je ne télécharge pas les classes du serveur (Interfaces) sur le client, je rajoute juste les mêmes fichiers dans le projet. Mais le chemin doit être exactement le même. Par exemple, sur le projet serveur, j'ai des packages java \ rmi \ services avec une interface et des implémentations de service, je dois créer le même package sur le projet client. Si je le change par java / rmi / server / services par exemple, j'obtiens l'exception ci-dessus. Même exception si la version de l'interface est différente entre le client et le serveur (même avec une ligne vide ajoutée par inadvertance ... je pense que rmi fait une sorte de hachage de classes pour vérifier la version ... je ne sais pas ... si cela pouvait Aidez-moi ...
la source
Mon serveur lançait cette exception dans les 2 jours et je l'ai résolue en déplaçant la fonction de déconnexion avec:
À la fin du fil de discussion. si cela peut aider quelqu'un.
la source
Dans la situation expliquée ci-dessous, le côté client lèvera une telle exception:
Le serveur est invité à authentifier le certificat client, mais le client fournit un certificat dont l'utilisation étendue de la clé ne prend pas en charge l'authentification du client, de sorte que le serveur n'accepte pas le certificat du client, puis ferme la connexion.
la source
Le côté client ssl lancera une telle exception dans la situation ci-dessous (j'avais testé),:
Le serveur est invité à authentifier le certificat client, mais le client fournit un certificat dont l'utilisation étendue de la clé ne prend pas en charge l'authentification client.
la source
J'étais confronté au même problème avec wireMock tout en se moquant des autres appels d'API. Plus tôt, je définissais le serveur comme ceci:
Mais il doit être défini comme indiqué ci-dessous:
la source
NullPointerException
problème, pas ce problème.