2010-05-29 5 views
0

Я бы хотел, чтобы поток ввода считывал блок вместо чтения конца потока (-1). Есть ли способ настроить поток для этого? Вот мой сервлет код:Не удается получить InputStream для чтения

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(); 
    } 

Вот мой 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(); 
     } 
    } 

Я попытался InputStream.read, но он не блокирует либо, он возвращает -1, а также. Я пытаюсь сохранить потоки ввода-вывода с обеих сторон живыми. Я хочу, чтобы сервлет дождался ввода, обработал вход, а затем отправил ответ.
В приведенном выше коде должно быть сделано это 20 раз.

спасибо за любую помощь

ответ

0

Вы ищете асинхронный ввод-вывод. Это встроено в Servlet 3.0 (пример приложения включен). Если вы все еще на Servlet 2.5 или старше, посмотрите на технику Comet, вот документ Tomcat-targeted.

0

Способ работы сервлета - простой механизм ответа на запрос. В Servlet вы читаете данные из Reader, а затем отправляете ответ в Writer.

В простых старых сервлетах до 3.0 или Comet или Continuations у вас нет возможности делать что-либо еще. Единственное, что вы можете сделать, это создать сеанс и отправить клиенту другой запрос на получение дополнительной информации (вы можете использовать что-то в запросе для выполнения того же самого сеанса).

Возможно, вы ищете способ открыть свое соединение. Для этого у вас есть несколько решений, которые могут работать или не работать в зависимости от конфигурации брандмауэра.

1) Переход к двигателю сервлетов, который поддерживает сервлет 3.x.
2) Используйте Tomcat Comet.
3) Используйте Continuations.
4) Используйте веб-гнезда.
5) Используйте keep_alive и есть клиент опрашивать открытое соединение

Как примечание: Вы никогда не должны положить спать в серверном коде, то есть непосредственный флаг, что вы делаете что-то неправильно.

Смежные вопросы