java.net.SocketException: Abandon de la connexion à l'origine du logiciel: recv failed

StackOverflow https://stackoverflow.com/questions/135919

  •  02-07-2019
  •  | 
  •  

Question

    

Cette question a déjà une réponse ici:

         

Je n'ai pas trouvé de réponse satisfaisante à la signification exacte de l'erreur suivante:

java.net.SocketException: interruption de connexion à l'origine du logiciel: échec de la reconnaissance

Notes:

  • Cette erreur est peu fréquente et imprévisible. bien que cette erreur signifie que toutes les futures demandes d’URI échoueront également.
  • La seule solution qui fonctionne (également à l'occasion) 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 d'effectuer la récupération).

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();
Était-ce utile?

La solution

Cela signifie généralement qu'il y a eu une erreur réseau, telle qu'un délai d'attente 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é quelque part, c’est une autre source de ce type d’erreurs.

Autres conseils

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

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 d’une connexion Internet, mais aussi systématiquement si le moment 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, de la mise en commun des connexions, de la persistance 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 ...

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/

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.

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

Cela se produira 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 dans votre application via son protocole de communication, puis en appelant shutdownInput et shutdownOutput pour nettoyer la session.

Regardez si un autre service ou programme est 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.

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

sc.setSoLinger(true, 10);

COPIER 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 laisse plus de temps pour la lecture ou l'envoi des données. / p>

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

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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top