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
Comment est résolu le problème?
plus sur elle ... stackoverflow.com/questions/5244839/...
ready()
avant d'essayer de le lire..ce faire à l'intérieur de la boucleComment 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
Vous devez vous connecter pour publier un commentaire.
eee solution fonctionne parfaitement. J'ai essayé de lire la sortie d'une conversation SMTP, mais il pourrait bloquer sur:
Modification:
Je peux lire tout simplement beau. br est un BufferedReader objet, BTW.
Être prudent en général lors de l'utilisation de readLine() après ready(). Prêt() vous dit qu'il y a des données à lire, mais cela ne signifie pas que c'est un ensemble de la ligne. Si readLine() peut encore bloquer.
OriginalL'auteur mojado
Il existe des données déjà dans la première
BufferedReader
(qui a été lu à partir de la douille, et n'est plus disponible à partir de la prise), donc passer laBufferedReader
créé dans le premier exemple de la classe qui lit l'application de messages spécifiques, plutôt que la création d'une nouvelleBufferedReader
de la prise de courant.Il le fait, et vous ne pouvez pas changer cela; c'est le contrat de sa méthode de lecture: docs.oracle.com/javase/1.5.0/docs/api/java/io/..., int, int)
OriginalL'auteur MeBigFatGuy
J'ai eu le même problème et voici ma solution:
OriginalL'auteur Andrew Archer