java.net.SocketException: le logiciel a causé l'interruption de la connexion: recv a échoué [dupliquer]
cette question a déjà une réponse ici:
- raisons officielles pour "interruption de connexion causée par le logiciel: erreur d'écriture de socket" 12 réponses
Je n'ai pas été en mesure de trouver une réponse adéquate à ce que signifie exactement l'erreur suivante:
java.net.SocketException: Software caused connection abort: recv failed
Notes:
- cette erreur est peu fréquente et imprévisible; bien que l'obtention de cette erreur signifie que toutes les futures demandes D'URIs échoueront également.
- la seule solution qui fonctionne (aussi, seulement occasionnellement) est de redémarrer Tomcat et/ou la machine actuelle (Windows dans ce cas).
- L'URI est définitivement disponible (comme confirmé en demandant au navigateur de faire le fetch).
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();
10 réponses
cela signifie habituellement qu'il y a eu une erreur réseau, comme un délai TCP. Je commencerais par placer un renifleur (wireshark) sur la connexion pour voir si vous pouvez voir des problèmes. S'il y a une erreur TCP, vous devriez pouvoir la voir. En outre, vous pouvez vérifier vos routeurs logs, si cela est applicable. Si le sans-fil est impliqué n'importe où, c'est une autre source pour ce genre d'erreurs.
cela se produit également si votre client TLS n'est pas en mesure d'ê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 pendant qu'il est encore de données dans le tampon d'envoi). La condition est très similaire à celle d'une connexion réinitialisée par peer. Cela peut se produire sporadiquement lors de la connexion sur Internet, mais aussi systématiquement si le timing est correct (par exemple avec des connexions keep-alive sur localhost).
un client HTTP doit simplement rouvrir la connexion et réessayer la requête. Il est important de comprendre que lorsqu'une connexion est dans cet état, il n'y a aucun moyen de s'en sortir d'autre que de le fermer. Toute tentative d'envoyer ou de recevoir produira la même erreur.
Ne pas utiliser URL.open()
, l'utilisation d'Apache-Commons HttpClient qui a un mécanisme de nouvelle tentative, le regroupement de connexions, keep-alive 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 ...
la seule fois où j'ai vu quelque chose comme ça se produire est quand j'ai une mauvaise connexion, ou quand quelqu'un ferme la prise que j'utilise à partir d'un contexte de thread différent.
accédez-vous aux données http? Pouvez-vous utiliser la bibliothèque HttpClient au lieu de la bibliothèque standard? La bibliothèque a plus d'options et fournira de meilleurs messages d'erreur.
essayez d'ajouter 'autoReconnect=true' à la chaîne de connexion JDBC
cela se produit de temps en temps, soit lorsqu'une connexion est interrompue, soit lorsqu'un hôte distant interrompt sa connexion (application fermée, arrêt d'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 clarifier la session.
regardez si vous avez un autre service ou programme tournant sur le port http. Il m'est arrivé quand j'ai essayé d'utiliser le port et il a été pris par un autre programme.
si vous utilisez Netbeans pour gérer Tomcat, essayez de désactiver le moniteur HTTP dans Outils-serveurs
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 explicitement définir un délai avant l'envoi d'une réinitialisation, donnant plus de temps pour la lecture ou l'envoi des données.
ce n'est peut-être pas la réponse à tout le monde, mais à certaines personnes.