2009-05-15 4 views
1

J'utilise le concept de canal de communication et NIO pour lire les données du client.
Comment Socket Channel sait-il que la lecture d'un fichier est terminée?Comment SocketChannel sait-il que la lecture d'un fichier est terminée?

ByteBuffer byteBuffer = ByteBuffer.allocate(BUFSIZE); 
int nbytes = socketChannel.getChannel().read(byteBuffer); 

Je lis les données à la fois si les données est faible, mais si les données est grande, je lis les données en fragments et enfin obtenir les mêmes données maintenant, je veux savoir comment le canal ne comprend pour fin des données.
Y a-t-il un moyen pour moi de savoir quand la lecture du fichier est terminée?

+0

Voir cet exemple NIOClient, il attend des caractères d'invite de terminaison ">>" spécifiques à l'application. C'est le marqueur end_of_packet. Vous pourriez implémenter un début similaire ou un début de chaque paquet avec une valeur de longueur de 4 octets. http://stackoverflow.com/questions/11745686/java-nio-client/27130710#27130710 – Whome

Répondre

4

Il y a trois options de base:

  • Le protocole pourrait préciser que la longueur du fichier doit venir avant que les données.
  • Le protocole pourrait indiquer une marque « la fin du fichier » (qui devrait être valable pour les données contenues dans le fichier, bien sûr)
  • Le serveur pourrait fermer la prise quand il avait terminé: votre read appel retournera - 1 pour vous informer lorsque toutes les données ont été lues

Fondamentalement, la façon dont les données sont diffusées, vous ne pouvez pas compter sur toutes les données descendant dans un nombre particulier de demandes.

Quel protocole utilisez-vous, et pouvez-vous le modifier de manière appropriée? Un préfixe de longueur est généralement la solution la plus simple.

Questions connexes