2010-05-29 8 views
0

Je souhaite que le flux d'entrée soit lu au lieu de lire la fin du flux (-1). Y at-il un moyen de configurer le flux pour le faire? Voici mon code Servlet:Impossible de lire InputStream au bloc

PrintWriter out = response.getWriter(); 
    BufferedReader in = request.getReader(); 
    try { 
     String line; 
     int loop = 0; 
     while (loop < 20) { 
      line = in.readLine(); 
      lgr.log(Level.INFO, line); 
      out.println("<" + loop + "html>"); 

      Thread.sleep(1000); 
      loop++; 
      // 
     } 
    } catch (InterruptedException ex) { 
     lgr.log(Level.SEVERE, null, ex); 
    } finally { 
     out.close(); 
    } 

Voici mon code Midlet:

private HttpConnection conn; 
    InputStream is; 
    OutputStream os; 
    private boolean exit = false; 

    public void run() { 

     String url = "http://localhost:8080/WebApplication2/NewServlet"; 
     try { 
      conn = 
        (HttpConnection) Connector.open(url); 
      is = conn.openInputStream(); 
      os = conn.openOutputStream(); 
      StringBuffer sb = new StringBuffer(); 
      int c; 

      while (!exit) { 
       os.write("<html>\n".getBytes()); 
       while ((c = is.read()) != -1) { 
        sb.append((char) c); 
       } 
       System.out.println(sb.toString()); 
       sb.delete(0, sb.length() - 1); 


       try { 
        Thread.sleep(1000); 
       } catch (InterruptedException ex) { 
        ex.printStackTrace(); 
       } 
      } 

      os.close(); 
      is.close(); 
      conn.close(); 

     } catch (IOException ex) { 
      ex.printStackTrace(); 
     } 
    } 

J'ai essayé InputStream.read, mais il ne bloque pas non plus, elle renvoie -1 aussi bien. J'essaie de garder les flux d'E/S de chaque côté en vie. Je souhaite que le servlet attende la saisie, traite l'entrée, puis renvoie une réponse.
Dans le code ci-dessus, il devrait faire cela 20 fois.

Merci pour toute aide

Répondre

0

Vous recherchez des E/S asynchrones. Ceci est intégré dans Servlet 3.0 (exemple d'application inclus). Si vous êtes encore sur Servlet 2.5 ou plus vieux, alors jetez un oeil à Comet technique, voici un document Tomcat-targeted.

0

Le fonctionnement d'une servlet est un mécanisme de réponse simple. Dans le servlet, vous lisez les données du Reader, puis renvoyez une réponse dans l'enregistreur.

Dans les anciennes Servlets antérieures à la version 3.0 ou Comet ou Continuations, vous n'avez pas la possibilité de faire quoi que ce soit d'autre. La seule chose que vous pouvez faire est de créer une session et demander au client de renvoyer une autre requête pour obtenir plus d'informations (vous pouvez utiliser quelque chose dans la requête pour faire la même chose qu'une session).

Ce que vous cherchez, c'est un moyen de garder votre connexion ouverte. Pour cela, vous avez plusieurs solutions qui peuvent ou peuvent ne pas fonctionner en fonction de la configuration de votre pare-feu.

1) Mise à niveau vers un moteur de servlet prenant en charge la spécification Servlet 3.x
2) Utiliser Tomcat Comet.
3) Utilisez les suites de jetées.
4) Utiliser Web Sockets.
5) Utiliser un KEEP_ALIVE et ont le sondage client la connexion ouverte

Comme une note: Vous ne devriez jamais mettre un sommeil dans votre code de serveur, qui est un indicateur immédiat que vous faites quelque chose de mal.