web-dev-qa-db-fra.com

java.net.SocketException: Abandon de la connexion provoqué par le logiciel: échec de la reconnaissance

Je n'ai pas été en mesure de trouver une réponse adéquate à la signification exacte de l'erreur suivante:

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

Remarques:

  • Cette erreur est peu fréquente et imprévisible. bien que l'obtention de cette erreur signifie que toutes les futures demandes d'URI échoueront également.
  • La seule solution qui fonctionne (même occasionnellement) consiste à redémarrer Tomcat et/ou la machine réelle (Windows dans ce cas).
  • L'URI est définitivement disponible (comme confirmé en demandant au navigateur de récupérer le contenu).

Code pertinent:

BufferedReader reader;
try { 
 URL url = new URL(URI);
 reader = new BufferedReader(new InputStreamReader(url.openStream())));
} catch( MalformedURLException e ) { 
 throw new IOException("Expecting a well-formed URL: " + e); 
}//end try: Have a stream

String buffer;
StringBuilder result = new StringBuilder();
while( null != (buffer = reader.readLine()) ) { 
 result.append(buffer); 
}//end while: Got the contents.
reader.close();
73
grammar31

Cela signifie généralement qu'une erreur réseau s'est produite, telle qu'un délai d'attente de TCP. Je commencerais par placer un renifleur (Wharshark) sur la connexion pour voir si vous pouvez voir un problème. S'il y a une erreur TCP, vous devriez pouvoir la voir. Vous pouvez également vérifier les journaux de votre routeur, le cas échéant. Si le sans fil est impliqué n'importe où, c'est une autre source de ce type d'erreur.

24
AdamC

Cela se produit également si votre client TLS ne peut pas être authentifié par le serveur configuré pour exiger une authentification du client.

21
desbocages

Cette erreur se produit lorsqu'une connexion est fermée brusquement (lorsqu'une connexion TCP est réinitialisée alors qu'il reste des données dans le tampon d'envoi). La condition est très similaire à une "connexion réinitialisée par un homologue" beaucoup plus courante. Cela peut se produire de manière sporadique lors de la connexion sur Internet, mais aussi systématiquement si le timing est correct (par exemple, avec des connexions persistantes sur localhost).

Un client HTTP doit simplement rouvrir la connexion et réessayer la demande. Il est important de comprendre que lorsqu'une connexion est dans cet état, il n'y a pas d'autre moyen d'en sortir que de la fermer. Toute tentative d'envoi ou de réception produira la même erreur.

N'utilisez pas URL.open(), utilisez Apache-Commons HttpClient qui dispose d'un mécanisme de nouvelle tentative, du regroupement de connexions, de la maintenance en vie et de nombreuses autres fonctionnalités.

Exemple d'utilisation:

HttpClient httpClient = HttpClients.custom()
            .setConnectionTimeToLive(20, TimeUnit.SECONDS)
            .setMaxConnTotal(400).setMaxConnPerRoute(400)
            .setDefaultRequestConfig(RequestConfig.custom()
                    .setSocketTimeout(30000).setConnectTimeout(5000).build())
            .setRetryHandler(new DefaultHttpRequestRetryHandler(5, true))
            .build();
// the httpClient should be re-used because it is pooled and thread-safe.

HttpGet request = new HttpGet(uri);
HttpResponse response = httpClient.execute(request);
reader = new BufferedReader(new InputStreamReader(response.getEntity().getContent()));
// handle response ...
10
rustyx

Accédez-vous aux données http? Pouvez-vous utiliser la bibliothèque HttpClient à la place de la bibliothèque standard? La bibliothèque a plus d'options et fournira de meilleurs messages d'erreur.

http://hc.Apache.org/httpclient-3.x/

4
Ken

La seule fois où j'ai vu quelque chose comme cela se produire, c'est quand j'ai une mauvaise connexion ou quand quelqu'un ferme le socket que j'utilise à partir d'un contexte de thread différent.

4
pfranza

Essayez d'ajouter 'autoReconnect = true' à la chaîne de connexion jdbc

2
Anantharaman

Regardez si vous avez un autre service ou programme exécuté sur le port http. Cela m'est arrivé lorsque j'ai essayé d'utiliser le port et qu'il a été repris par un autre programme.

1
trinity

Moi aussi j'ai eu ce problème. Ma solution était:

sc.setSoLinger(true, 10);

COPIE À PARTIR D'UN SITE WEB -> En utilisant la méthode setSoLinger(), vous pouvez définir explicitement un délai avant l'envoi d'une réinitialisation, ce qui donne plus de temps pour la lecture ou l'envoi de données.

Peut-être que ce n'est pas la réponse à tout le monde mais à certaines personnes.

1
Sergio

Cela se produit de temps en temps, soit à l'expiration d'une connexion, soit lorsqu'un hôte distant met fin à sa connexion (application fermée, arrêt de l'ordinateur, etc.). Vous pouvez éviter cela en gérant vous-même les sockets et en gérant les déconnexions de votre application via son protocole de communication, puis en appelant shutdownInput et shutdownOutput pour éclaircir la session.

1
Michael J. Gray

Si vous utilisez Netbeans pour gérer Tomcat, essayez de désactiver le moniteur HTTP dans Outils - Serveurs.

0
Maroš Košina