La lecture de tous les commentaires à partir d'une prise en continu
Je suis en train d'écrire un simple Java application client/serveur pour mon propre usage. Il devrait permettre aux clients d'envoyer seule ligne de texte des messages et lire multiligne réponses. Ce type de communication doit être répétées plusieurs fois en utilisant la même connexion.
C'est ce que j'ai dans le client pour la lecture des réponses:
BufferedReader input = new BufferedReader(new InputStreamReader(server.getInputStream()));
String line;
while ((line = input.readLine()) != null) {
//processing here
}
Le problème, c'est que readLine() bloque une fois que le serveur envoie la première réponse et le client ne peut envoyer de nouveaux messages à cause de cela. C'est compréhensible. Un naïf solution pourrait être de faire le serveur le signal de la fin de sa production par l'envoi d'une sorte de particuliers connus de la chaîne de valeur dont le client serait alors de reconnaître et de mettre fin à la lecture de la boucle. Cependant, est-il une meilleure solution à ce problème?
La solution habituelle de ce traitement est de deux threads asynchrones; où on lit, l'autre écrit, et le thread principal conserve la manipulation de l'interface graphique. Et vous construire des choses sur les files d'attente, de sorte que l'interface utilisateur peut ajouter des messages d'une file d'attente que le thread d'écriture peuvent envoyer dès qu'il est libre.
Lindsjö: je veux lire TOUTES les lignes puis envoyer un nouveau message alors lire TOUTES les lignes de nouveau et envoyer un nouveau message... Le problème est que readLine blocs.
Ensuite, vous avez besoin d'un marqueur pour indiquer la fin de vos lignes actuelles. Ce que vous demandez pour l'instant est qu'il y aura un nombre inconnu de lignes, et ils vont prendre un inconnu de la période de temps à arriver, et après encore un autre, inconnu période de temps, il y aura un autre inconnu nombre de lignes et que vous voulez que votre programme de faire la distinction entre ces deux groupes de lignes.
OriginalL'auteur Ree | 2011-12-09
Vous devez vous connecter pour publier un commentaire.
Depuis votre client doit lire plusieurs multiligne réponses à partir de la même connexion et le processus de chaque bloc de la réponse,
cela peut être utile pour votre cas :
Vous pouvez utiliser votre propre chaîne de caractères spéciaux pour reconnaître le début et la fin de chaque bloc de message.
OriginalL'auteur gtiwari333
Je ne voudrais pas compter sur
readLine
pour votre boucle principale raisonreadLine
s'appuie sur "l'avenir" de données (CR ou LF ou CR+LF, et renvoie null si la fin du flux a été atteint). De ce fait, si le CR n'est pas suivie par un LF, leBufferedReader
qui se bloque. CettereadLine
méthode est plus appropriée pour la lecture de contenu de fichier.Dans votre cas, je voudrais lire un caractère à la fois avec
Mais même ce comportement est douteux, car un char Unicode peut être plus d'un octet, de sorte que le flux pourrait être bloqué si le premier octet est envoyé et pas le second. Êtes-vous sûr que votre communication est l'Unicode? Si non, un
InputStream
serait plus approprié qu'unReader
.OriginalL'auteur solendil