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:

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();
69
demandé sur grammar31 2008-09-26 00:43:00

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.

22
répondu AdamC 2008-09-25 20:50:21

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.

19
répondu desbocages 2014-04-22 12:53:03

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 ...
5
répondu rustyx 2015-03-30 07:56:08

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.

4
répondu pfranza 2008-09-25 20:49:56

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.

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

3
répondu Ken 2008-09-25 20:49:26

essayez d'ajouter 'autoReconnect=true' à la chaîne de connexion JDBC

2
répondu Anantharaman 2011-12-28 06:54:00

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.

1
répondu Michael J. Gray 2012-04-20 12:32:40

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.

1
répondu trinity 2012-08-24 14:59:30

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

0
répondu Maroš Košina 2013-11-11 11:15:18

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.

0
répondu Sergio 2014-08-25 06:05:51