2010-06-08 6 views
0

J'ai un DataInputStream, créé à partir d'un Socket en Java. La connexion est à un serveur Web simple qui utilise un codage de transfert en bloc. Le serveur web fonctionne en effet dans un navigateur normal. Mais dans mon programme, j'essaye de lire, j'ai lu les premiers premiers octets (environ 5kb de données). Mais chaque lecture après cela renvoie 0 octets lus. N'est-il pas censé bloquer jusqu'à ce qu'il puisse lire?Qu'est-ce que cela signifie quand un DataInputStream continue à renvoyer 0?

Remarque: Cela ne se produit généralement pas. Le problème est avec le serveur auquel je me connecte.

En outre, ce code ici toutes les fausses déclarations, même après l'bytesRead == 0 .:

 System.out.println(socket.isClosed()); 
     System.out.println(socket.isInputShutdown()); 
     System.out.println(socket.isOutputShutdown()); 

Et voici les en-têtes resp:

HTTP/1.1 200 OK 

Date: Tue, 08 Jun 2010 14:01:01 GMT 

Server: Apache/2.2.11 (Unix) PHP/5.2.10 

X-Powered-By: PHP/5.2.10 

Expires: Thu, 19 Nov 1981 08:52:00 GMT 

Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 

Pragma: no-cache 

Keep-Alive: timeout=5, max=100 

Connection: Keep-Alive 

Transfer-Encoding: chunked 

Content-Type: text/html 
+0

Faut-il supposer que vous voulez dire 'ByteArrayInputStream' plutôt que' ByteInputStream'? – Powerlord

+0

Désolé complètement. En fait, c'est DataInputStream! – Zombies

+0

C'est étrange ... les méthodes de lecture de 'DataInputStream' * devraient * bloquer. La raison que j'ai posée est parce que 'ByteArrayInputStream' semble être l'exception à la règle sur le blocage des lectures (il ne bloque jamais). – Powerlord

Répondre

-1

Vous avez raison, un InputStream ne doit jamais renvoie 0 en lecture. Il doit soit bloquer jusqu'à ce qu'un octet soit disponible, soit retourner -1 qui indique EOF.

Y a-t-il une chance que vous fournissiez un test élémentaire? J'ai déjà vu un bug like this auparavant.

+0

Je vais regarder dedans. C'est un peu difficile parce que ça dépend du serveur aussi. La plupart du temps, cela ne se produit pas. – Zombies

+0

Ce n'est pas correct, voir ci-dessus. Si le tampon est de longueur zéro ou si la longueur spécifiée est zéro, il retournera zéro. – EJP

+0

En effet, je ne m'attendais pas à une requête de lecture de 0 octet. –