Socket, BufferedReader se bloque à readLine()

J'ai un serveur qui, initialement, n'est-ce:-

BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
for (;;) {
  String cmdLine = br.readLine();
  if (cmdLine == null || cmdLine.length() == 0)
     break; 
  ...
}

plus tard, il passe à la prise secteur à l'autre de la classe "toto"
Cette classe d'attente pour l'application des messages spécifiques.

 BufferedReader br = new BufferedReader(new InputStreamReader(s.getInputStream()));
 appCmd=br.readLine();

Mon client envoie cette séquence:

  • "bar\n"
  • "comment sont-u?\n"
  • "\n"
  • "en le passant à la foo\n"
  • "\n"

Le problème est que, parfois, "foo" ne pas obtenir sa réponse. Il est suspendu dans le readLine().

Quel est le risque que readLine() dans le serveur de mise en mémoire tampon des données à l'aide de la lecture à l'avance et "foo" la classe est arriver affamé?

Si j'ajoute un sommeil chez le client, il fonctionne. Mais quelles sont les chances qu'il le sera toujours?

  • "bar\n"
  • "comment sont-u?\n"
  • "\n"
  • sleep(1000);
  • "en le passant à la foo\n"
  • "\n"

Comment résoudre le problème? Reconnaissant de toute aide sur ce sujet.

Vous pouvez aussi vérifier si les données sont prêtes en utilisant BufferedReader de ready() avant d'essayer de le lire..ce faire à l'intérieur de la boucle
Comment est résolu le problème?
ready() - tell whether this stream is ready to be read. Habituellement, j'utilise cette collaboration avec read(). Je ne l'utilise pas avec readLine() par exemple: while(true) { if (br.ready()) { br.read(cb); cb.flip(); String msg = cb.toString(); if (msg == null) break; } } cb est un CharBuffer d'une certaine taille de la mémoire tampon. Cette technique permettra la lecture d'un certain nombre de lignes autorisées dans la mémoire tampon.
plus sur elle ... stackoverflow.com/questions/5244839/...

OriginalL'auteur ashim | 2011-05-13