2010-01-29 5 views
2

Selon la documentation Java, la méthode renvoie lecture():Que signifie -1 de la fonction read() de DataInputStream?

  • -1 s'il n'y a pas plus de données, car la fin du flux a été atteint

Je ne comprends pas tout à fait ce qu'ils signifie par "fin de flux".

Actuellement, je ferme/ré-ouvre le socket lorsque cela se produit (ce que j'ai compris de beaucoup de Google pour être un moyen acceptable de faire face à cela). Est-ce que -1 est un comportement "normal"? Ne devrais-je pas réagir de manière aussi dramatique? Peut-être serait-il préférable de ne se fâcher que sur une IOException?

création Socket:

clientSocket = new Socket(InetAddress.getByName(remoteHost), remotePort, InetAddress.getByName(sourceIpAddress), 0); 

Quelques informations de fond:

  • je suis en utilisant l'attribut 'localaddr' lors de la création du socket (exigence de projet)
  • je suis sous Windows XP SP2
  • Je n'ai aucune idée de la façon dont le serveur distant gère les sockets (ou même quelle langue, pas que cela devrait importer)
  • cela se produit très rarement (peut-être une fois par jour)
  • ne se produit avec un client distant spécifique sous Linux
  • la peine-certains clients et moi-même sont à la fois derrière de nombreux pare-feu
  • cela se produit jamais avec les clients exécutant différentes saveurs de XP (peut-être il est temps d'installer une image VMware exécutant Linux!)

Répondre

2

L'autre extrémité du socket a fermé le flux, donc il n'y a plus de données à lire - vous avez atteint la fin. Je diagnostiquerais plus loin avec un moniteur de réseau tel que Wireshark quant à la raison pour laquelle le socket est fermé.

+0

Mais -1 est-il une garantie que le socket est vraiment, vraiment fermé? J'étais capable d'envoyer des données à cette socket sans provoquer d'exception, bien que je ne puisse pas dire si l'autre bout l'a réellement reçu. Wireshark est un excellent pourboire. Malheureusement, je l'ai commencé APRÈS ceci est arrivé et cela ne s'est pas produit depuis. – glenneroo

+1

L'abstraction Socket supporte la notion que les côtés d'entrée et de sortie de la communication peuvent être fermés indépendamment. Ainsi, si l'autre extrémité a fermé sa sortie mais ne l'a pas saisie, vous pouvez continuer à écrire la sortie du socket une fois que vous avez une fin de flux sur votre entrée socket. –

Questions connexes