无法将InputStream读取到块

时间:2010-05-29 02:16:11

标签: java servlets blocking inputstream

我希望读取的输入流阻塞而不是读取流的结尾(-1)。有没有办法配置流来执行此操作?这是我的Servlet代码:

    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。 我试图保持两边的I / O流活着。 我希望servlet等待输入,处理输入,然后发回响应 在上面的代码中,它应该执行20次。

感谢您的帮助

3 个答案:

答案 0 :(得分:0)

根据JavaDoc:

http://java.sun.com/j2se/1.4.2/docs/api/java/io/InputStream.html#read()

  

此方法将阻塞,直到输入数据可用,检测到文件结尾或抛出异常。

因此,只要您在一端提供缓冲区,就会在另一端使用缓冲区。

答案 1 :(得分:0)

您正在寻找异步IO。这内置于Servlet 3.0(包含示例应用)。如果您还在使用Servlet 2.5或更早版本,请查看Comet技术,这是Tomcat-targeted文档。

答案 2 :(得分:0)

Servlet的工作方式是一种简单的请求回复机制。在Servlet中,您从Reader中读取数据,然后在Writer中发回回复。

在3.0或Comet或Continuations之前的普通旧Servlet中,您无法执行任何其他操作。你唯一能做的就是创建一个Session并让客户端发回另一个请求以获取更多信息(你可以使用Request中的某些东西来做与Session相同的事情)。

您正在寻找的是一种保持Connection畅通的方法。为此,根据您的防火墙配置,您可以使用或不使用多种解决方案。

1)升级到支持Servlet 3.x规范的Servlet引擎
2)使用Tomcat Comet 3)使用Jetty Continuations 4)使用Web套接字 5)使用KEEP_ALIVE并让客户端轮询打开的连接

作为一个注释:你不应该在你的服务器代码中放入Sleep,这是你做错了什么的直接标志。