2012-12-28 1 views
0

Tout d'abord, si vous m'avez aidé à résoudre mon problème en lisant une réponse HTTP de longueur indéfinie, je tiens à vous remercier. J'ai suivi votre conseil et suis passé des réponses HTTP aux sockets Java brutes. Mais j'ai aussi un petit problème avec ça. La nature d'un serveur Push est de pousser les choses au client lorsqu'elles sont reçues (dans mon cas, le système utilise un fichier étiqueté avec l'ID de l'appareil). Le problème est qu'avec l'exemple KnockKnock sur les Tutoriels Java, leur code:Quelle est la bonne façon d'attendre une réponse de client dans Java?

while ((inputLine = in.readLine()) != null) {... 

Attend que le client envoie quelque chose avant d'envoyer lui-même quelque chose. Je décide donc d'utiliser:

while (true) { 
    if ((inputLine=in.readLine())==null) inputLine=""; 
    ... 

Si l'un des interpereters d'entrée obtenir cette chaîne vide, alors ils ne feront rien.

Ma question est essentiellement celle qui est la meilleure et, si c'est la première, comment puis-je continuer à vérifier le fichier pour envoyer ce qui est requis sans engendrer un thread?

+0

La question a reçu une réponse [ici] (http://stackoverflow.com/q/14077960/207421). – EJP

Répondre

2

Le premier implémente le protocole imaginé pour l'exemple KnockKnock: un client envoie "KnockKnock", et le serveur répond.

Le second n'a pas beaucoup de sens. Si le client a un flux de sortie ouvert avec le serveur et que le serveur appelle readLine(), cela signifie qu'il attend une ligne du client. Et l'appel bloquera jusqu'à ce que le client envoie une ligne, ou ferme le socket.

Il semble que vous n'attendiez aucune entrée du client. Dans ce cas, n'ouvrez pas du tout un flux d'entrée et n'appelez pas readLine() sur le flux d'entrée (évidemment). Envoyez ce que vous devez envoyer au client directement, dès que vous voulez l'envoyer.

+0

En fait, je m'attends à ce qu'il y ait une communication bidirectionnelle (au moins pour le début de la poignée de main) mais après cela, il écoute seulement une commande pour arrêter la connexion: "servicedeath \ n" –

Questions connexes