2010-11-02 25 views
1

Mon client HTTP apache lit les données d'un serveur qui envoie du streaming HTTP (sous forme de données fragmentées).Impossible de fermer le streaming http sur une mauvaise réponse

J'ai un flux d'entrée et un lecteur mis en mémoire tampon pour obtenir des données, et de lire ces données en utilisant la méthode readLine de données tamponnées.

InputStream inputStream = httpEntity.getContent(); 
br= new BufferedReader(new InputStreamReader(inputStream)); 

while ((line = br.readLine()) != null) 

Je veux fermer la connexion si je reçois une mauvaise réponse du serveur.

Pour cela, je crée un masque temporel à un intervalle de temps pour fermer ma connexion. J'analyse la réponse chaque fois que je la reçois pour vérifier si la réponse est correcte, si la réponse est correcte puis je réinitialise le timetask. Si je trouve une mauvaise réponse dans ce cas je ne réinitialise pas le timertask (et laisse le timertask être exécuté à l'heure pour laquelle il a été précédemment défini)

Je veux savoir si l'utilisation d'E/S sans tampon peut aider? ou j'ai besoin d'une autre approche?

Problème Je vois est que la connexion est ouverte, mon timestask est incapable de fermer la connexion. inputStream.close ou bufferReader.close les deux ne sont pas capables d'exécuter (semblent attendre infiniment)

Répondre

1

BufferReader.close() fermera seulement l'inputStream, qui à son tour appellera inputStream.close(). Selon le java api InputStream.close() ne fait rien. Vous devez fermer le socket, ou tout ce que vous êtes en train d'analyser par httpEntity.

+1

Salut, Merci pour la réponse. Je suis en train d'abstraire le socket lui-même. Y at-il de toute façon pour obtenir l'accès Socket (socket fermer). de HTTClient ou HttpEntity? – HemantT

+0

Pouvez-vous ajouter une méthode 'close' à HTTPClient ou HttpEntity qui appelle la méthode' close' de son attribut socket? –