J'utilise le client http apache commons pour appeler l'URL en utilisant la méthode post pour publier les paramètres et il lance rarement l'erreur ci-dessous.
java.net.SocketException: Broken pipe
at java.net.SocketOutputStream.socketWrite0(Native Method)
at java.net.SocketOutputStream.socketWrite(SocketOutputStream.java:92)
at java.net.SocketOutputStream.write(SocketOutputStream.java:136)
at java.io.BufferedOutputStream.write(BufferedOutputStream.java:105)
at java.io.FilterOutputStream.write(FilterOutputStream.java:80)
at org.apache.commons.httpclient.methods.ByteArrayRequestEntity.writeRequest(ByteArrayRequestEntity.java:90)
at org.apache.commons.httpclient.methods.EntityEnclosingMethod.writeRequestBody(EntityEnclosingMethod.java:499)
at org.apache.commons.httpclient.HttpMethodBase.writeRequest(HttpMethodBase.java:2114)
at org.apache.commons.httpclient.HttpMethodBase.execute(HttpMethodBase.java:1096)
at org.apache.commons.httpclient.HttpMethodDirector.executeWithRetry(HttpMethodDirector.java:398)
Quelqu'un peut-il suggérer ce qui cause cette exception et comment la déboguer?
Réponses:
Ceci est causé par:
Donc, dans les deux cas, vous avez un protocole d'application mal défini ou implémenté.
Il y a une troisième raison que je ne vais pas documenter ici, mais qui implique que le pair prenne des mesures délibérées pour réinitialiser plutôt que fermer correctement la connexion.
la source
XMLHttpRequest.abort()
).Dans notre cas, nous en avons fait l'expérience lors d'un test de charge sur notre serveur d'applications. Le problème s'est avéré que nous devions ajouter de la mémoire supplémentaire à notre JVM car elle était à court. Cela a résolu le problème.
Essayez d'augmenter la mémoire disponible pour la JVM et / ou surveillez l'utilisation de la mémoire lorsque vous obtenez ces erreurs.
la source
SocketException: tuyau cassé, est provoqué par «l'autre extrémité» (le client ou le serveur) fermant la connexion pendant que votre code lit ou écrit sur la connexion.
Il s'agit d'une exception très courante dans les applications client / serveur qui reçoivent du trafic de clients ou de serveurs en dehors du contrôle d'application. Par exemple, le client est un navigateur. Si le navigateur effectue un appel Ajax et / ou que l'utilisateur ferme simplement la page ou le navigateur, cela peut effectivement tuer toutes les communications de manière inattendue. Fondamentalement, vous verrez cette erreur chaque fois que l'autre extrémité met fin à son application et que vous ne l'aviez pas anticipée.
Si vous rencontrez cette exception dans votre application, cela signifie que vous devez vérifier votre code où l'IO (entrée / sortie) se produit et l'envelopper avec un bloc try / catch pour intercepter cette IOException. C'est alors à vous de décider comment vous voulez gérer cette situation semi-valide.
Dans votre cas, le premier endroit où vous avez encore le contrôle est l'appel à
HttpMethodDirector.executeWithRetry
- Assurez-vous donc que l'appel est encapsulé avec le bloc try / catch et gérez-le comme bon vous semble.Je déconseille fortement de consigner les erreurs spécifiques de SocketException-Broken Pipe à autre chose que les niveaux de débogage / trace. Sinon, cela peut être utilisé comme une forme d'attaque DOS (Denial Of Service) en remplissant les journaux. Essayez de renforcer et de tester négativement votre application pour ce scénario courant.
la source
Tous les flux et connexions ouverts doivent être correctement fermés, donc la prochaine fois que nous essaierons d'utiliser l'objet urlConnection, cela ne génère pas d'erreur. À titre d'exemple, le changement de code suivant a corrigé l'erreur pour moi.
Avant:
Après:
la source
BufferedOutputStream
toujours appelclose()
à son flux de sortie sous-jacent (donc sur le flux de sortie deurlConnection
). Voir docs.oracle.com/javase/6/docs/api/java/io/… et docs.oracle.com/javase/6/docs/api/java/io / ... Ainsi, lorsque vous appelez,os.close()
il aurait déjà dû être fermé . Non?J'ai implémenté la fonctionnalité de téléchargement de données via le serveur FTP et j'ai trouvé la même exception là aussi lors de la reprise de ce téléchargement. Pour résoudre cette exception, vous devrez toujours vous déconnecter de la session précédente et créer une nouvelle instance du client et une nouvelle connexion avec le serveur. Cette même approche pourrait également être utile pour HTTPClient.
la source
J'avais le même problème pendant que je développais une application Java simple qui écoute sur un TCP spécifique. Habituellement, je n'avais aucun problème, mais lorsque j'ai exécuté un test de résistance, j'ai remarqué qu'une connexion s'était rompue avec une erreur
socket write exception
.Après enquête, j'ai trouvé une solution qui résout mon problème. Je sais que cette question est assez ancienne, mais je préfère partager ma solution, quelqu'un peut la trouver utile.
Le problème était sur la création de ServerSocket. J'ai lu de Javadoc qu'il y a une limite par défaut de 50 sockets en attente. Si vous essayez d'ouvrir une autre connexion, celles-ci seront refusées. La solution consiste simplement à modifier cette configuration par défaut côté serveur. Dans le cas suivant, je crée un serveur Socket qui écoute sur le port TCP
10_000
et accepte le maximum de200
sockets en attente.Depuis Javadoc de ServerSocket :
la source
Le problème peut être que vos fichiers déployés ne sont pas mis à jour avec les méthodes RMI appropriées. Vérifiez que votre interface RMI a mis à jour des paramètres ou des structures de données mises à jour que votre client ne possède pas. Ou que votre client RMI n'a aucun paramètre différent de celui de votre version de serveur.
Ceci est juste une supposition éclairée. Après avoir redéployé les fichiers de classe de mon application serveur et retesté, le problème du "tuyau cassé" a disparu.
la source
Les réponses ci-dessus illustrent la raison de ceci
java.net.SocketException: Broken pipe
: l'autre extrémité a fermé la connexion. J'aimerais partager l'expérience de ce qui s'est passé quand je l'ai rencontré:Content-Type
tête est défini par erreur plus grand que le corps de la demande (en fait, il n'y avait pas de corps du tout)Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception java.net.SocketTimeoutException: null
java.net.SocketException: Broken pipe
parce que le client l'a fermé.Parfois, tomcat ne lance pas d'exception de pip cassé, car une exception de délai d'expiration ferme la connexion, pourquoi une telle différence me déroute aussi.
la source
Content-Type
tête ne spécifie pas de nombre, il ne peut donc pas être «plus grand» que tout. Les exceptions de temporisation ne ferment pas le socket. La réponse n'a aucun sens.Vous devez augmenter le paramètre "backlog" de votre ServerSocket, par exemple
la source
La cause est que le pair distant ferme sa socket (crash par exemple), donc si vous essayez de lui écrire des données par exemple, vous obtiendrez ceci. pour résoudre cela, protégez les opérations de lecture / écriture sur socket entre (essayez catch), puis gérez le cas de perte de connexion dans le catch (renouveler la connexion, arrêter le programme, ... etc):
la source