java.net.Exception socketexception: la réinitialisation de la Connexion Avec HTTPConnection
Je suis en train d'essayer de frapper une certaine API externe pour récupérer certaines données. Lorsque la taille des données est petit, tout fonctionne bien, mais lorsque la taille des données retournées par l'API est big-je obtenir la RÉINITIALISATION de la CONNEXION exception. Le code ci-dessous est à partir de la classe java InterfaceHelper et j'ai également marqué le commentaire en ligne pas où j'en suis arriver exception [Son tout en essayant de lire les données à partir de InputStream].
J'ai essayé de chercher sur ainsi beaucoup de question sur STACKOVERFLOW lui-même, mais n'a pas trouver une réponse appropriée. Donc merci de ne pas le marquer comme double question. Je veux savoir quelle est la raison derrière le problème et quelle est la bonne solution pour ce problème. Si vous trouvez cette question des doublons, merci de répondre avant le marquant comme en double. J'ose vous.
Trouver ci-dessous mon code que j'ai utilisé. URL de certains mannequin url que pour des raisons de sécurité je ne peux pas mentionner l'URL que j'ai utilisé.
try{
URL url = new URL("http://example.com/someParams/SOME-ACCESS-TOKEN");
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod("GET");
connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded");
connection.setRequestProperty("Content-Language", "en-US");
connection.setRequestProperty("X-EXAMPLE-LOGIN", "XXXXXXXX");
connection.setRequestProperty("X-EXAMPLE-PASSWORD", "XXXXXX");
connection.setUseCaches(false);
connection.setDoInput(true);
connection.setDoOutput(true);
DataInputStream input = new DataInputStream(connection.getInputStream());
String ret = "";
if(input!=null){
for( int c = input.read(); c != -1; c = input.read() ) { //InterfaceHelper.java:695
ret = ret + String.valueOf((char)c);
}
}
if(input!=null)
input.close();
if(connection!=null)
connection.disconnect();
if(ret!=null && ret.length()>0){
return ret;
}
}catch(Exception e) {
e.printStackTrace();
}
Cette exception-je obtenir
java.net.SocketException: Connection reset
at java.net.SocketInputStream.read(SocketInputStream.java:196)
at java.net.SocketInputStream.read(SocketInputStream.java:122)
at sun.security.ssl.InputRecord.readFully(InputRecord.java:442)
at sun.security.ssl.InputRecord.readV3Record(InputRecord.java:554)
at sun.security.ssl.InputRecord.read(InputRecord.java:509)
at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:927)
at sun.security.ssl.SSLSocketImpl.readDataRecord(SSLSocketImpl.java:884)
at sun.security.ssl.AppInputStream.read(AppInputStream.java:102)
at java.io.BufferedInputStream.fill(BufferedInputStream.java:235)
at java.io.BufferedInputStream.read1(BufferedInputStream.java:275)
at java.io.BufferedInputStream.read(BufferedInputStream.java:334)
at sun.net.www.http.ChunkedInputStream.fastRead(ChunkedInputStream.java:244)
at sun.net.www.http.ChunkedInputStream.read(ChunkedInputStream.java:689)
at java.io.FilterInputStream.read(FilterInputStream.java:133)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3053)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3047)
at sun.net.www.protocol.http.HttpURLConnection$HttpInputStream.read(HttpURLConnection.java:3035)
at java.io.FilterInputStream.read(FilterInputStream.java:83)
at com.lsa.akosha.util.InterfaceHelper.hitApiBrandWatch(InterfaceHelper.java:695)
at com.lsa.akosha.service.brand.BrandCronService.brandSentiments(BrandCronService.java:288)
at com.lsa.akosha.util.thread.BrandWatchCronConverse.executeInternal(BrandWatchCronConverse.java:60)
at org.springframework.scheduling.quartz.QuartzJobBean.execute(QuartzJobBean.java:113)
at org.quartz.core.JobRunShell.run(JobRunShell.java:213)
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:557)
- essayez de déboguer votre code et peut-être que vous trouverez votre problème
- J'ai essayé, mais il jette toujours exception à la "DataInputStream input = new DataInputStream(connexion.getInputStream ());", mais dans l'impression trace de la pile de toujours montrer exception se produire tout en essayant de lire c'est à dire pour la boucle
- Essayez ce code sur une autre machine (ou peut-être en le tournant d'anti-virus).
- Le code que vous avez posté est impossible de produire ce stacktrace. Il est SSL dans la trace de la pile et un texte en clair URL HTTP. Et
connection.setRequestProperty("Content-Type","application/x-www-form-urlencoded"
est aussi futile ici que vous n'êtes pas en soumettant du contenu. Ce n'est peut-être le code réel. NBconnection
etinput
ne peut pas être nulle au niveau des points, vous êtes à l'épreuve. Ne pas écrire futile tests.
Vous devez vous connecter pour publier un commentaire.
c'est peut être de ça, mais j'ai trouvé "bizarre" des choses dans votre post.
Je dis juste que cela peut être trompeur dans une certaine mesure.
Maintenant en ce qui concerne la question elle-même.
Tout-en-tout - réinitialisation de la connexion signifie que, pour une raison quelconque, la connexion entre le client et le serveur est interrompue. Par exemple, le serveur décide de fermer la connexion.
Le processus de débogage peut être vraiment difficile ici, alors si j'étais vous,
J'aurais essayé un couple de techniques, en fonction de l'environnement vous travaillez sur:
Supprimer SSL et de travailler avec la plaine HTTP. De cette façon, vous pouvez mettre un proxy entre-deux et d'analyser le trafic réseau mieux. Des trucs comme Burp peut vous aider ici.
Essayer d'éliminer la possibilité que certains pare-feu/proxy/whatever juste décharges de la connexion pour ses propres raisons. Peut-être que ça vaut la peine d'exécuter ce code dans la même machine avec le serveur (bien sûr, si ses une option viable) juste pour le plaisir de tester la façon dont cela fonctionne avec "localhost", vous savez.
Je ne suis pas vraiment familier avec ce niveau relativement faible de l'API et de connaître tous ses caprices.
Mais peut-être que vous pouvez utiliser HttpClient au lieu de cela, de cette façon vous aurez probablement éliminer le besoin de connaître tous les "bas niveau" des drapeaux, c'est peut-être quelque chose de mal là.
Espère que cette aide
connexion.setRequestMethod("GET");
À la place la méthode get essayez d'utiliser
connexion.setRequestMethod("POST");
parce que la méthode get a la limite pour envoyer les données.
connection.setDoOutput(true);
définit la méthode de demande dePOST
de toute façon.setRequestMethod()
et le réglage de la"Content-Type"
si vous n'êtes pas d'envoyer tout le contenu?POST
et laContent-type
. Vous êtes en train de contredire vous-même et vous avez besoin pour résoudre le problème. Personne d'autre ne peut le faire pour vous.Ce n'est clairement pas le code réel, comme indiqué dans mon commentaire ci-dessus, mais
Vous n'êtes pas d'envoyer une sortie de sorte que vous ne devriez pas être l'appel de ces méthodes à tous. Et
setDoOutput(true)
contreditsetRequestMethod("GET");
.Sinon, envoyer une partie de la sortie.
xxx
etyyy
fera. Mais vous devez afficher le code réel. Vous n'avez même pas posté une URL HTTPS. Vous vous attendez à beaucoup de choses ici.J'ai essayé de le corriger encore et encore, cette fois pendant le débogage, j'ai trouvé que la lecture de données à partir de DataInputStream est le coupable ici.
La ligne dataInputStream.read() lit un caractère à la fois, et je dois le convertir en Chaîne de caractères. Ci-dessous est le code
Le principal problème est que je suis à la lecture des données de type int et puis le convertir en char, puis en Chaîne c'est à dire ret = ret + Chaîne.valueOf((char)c);.
Maintenant, j'ai enlevé la DataInputStream et utilisé BufferInputStream et utilisé bufferInputStream.readLine() qui lire directement de la ligne de chaîne à partir de InputStream, donc pas de conversion de type, qui permet d'économiser beaucoup de temps dans la lecture des données de flux et de là jusqu'à l'heure de connexion et flux à l'expiration du lit les données et puis j'ai fermer les deux.
De cette façon, mon problème est résolu. Je suis de poster mon nouveau code qui m'aide dans la résolution de mon problème.