【问题标题】:Read chunked response读取分块响应
【发布时间】:2014-09-24 05:29:49
【问题描述】:


我正在尝试读取 servlet 中的文件并将其作为分块消息发送(响应)到 jsp,我可以在浏览器中将其作为纯文本查看。
这是我尝试过的:
Servlet:

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
    response.setContentType("text/plain");
    response.setHeader("Transfer-Encoding", "chunked");
    response.setHeader("Connection", "keep-alive");
    //response.flushBuffer();
    try (PrintWriter writer = response.getWriter();BufferedReader br = new BufferedReader(new FileReader("/some/file/path.txt"))) {
            String line;
            while ((line = br.readLine()) != null) {
                writer.println(line);
                try{Thread.sleep(500);}
                catch(InterruptedException e){}
            }
    }
}

jsp:

<head>
<meta charset="UTF-8">
<title>example</title>
<script src="http://code.jquery.com/jquery-latest.min.js"></script>
<script>
    $(document).ready(function() {                                   
      $.get('/project/trial', function(responseText) {
        $('#message').text(responseText);                  
      });
  });
</script>
</head>
<body>
<div id="message"></div>
</body>

我需要在不刷新页面的情况下每 500 毫秒用新行更新一次页面,而是在读取整个文件后一次获取整个文件。
难道我做错了什么?我错过了什么吗?
我的jsp正确吗?
我在网上尝试了很多资源,但找不到我缺少的东西。
是否有任何示例可以让我获得对分块响应读写的支持?

提前致谢。

【问题讨论】:

  • 这样不行。浏览器将等待读取整个响应然后呈现它。如果您希望分段刷新,则必须通过 AJAX 执行某些操作。 NB 这与分块传输模式无关。
  • 哦,好的。您能否通过一些示例向我建议如何在这种情况下使用 AJAX 以及如何使用分块消息。有什么场景可以同时使用吗?
  • 此外......您发送的内容并不是真正的块编码。那将是&lt;chunklength&gt;&lt;CR&gt;&lt;LF&gt;&lt;chunk&gt;&lt;CR&gt;&lt;LF&gt;。除非 JSP 通过一些神奇的干预来解决这个问题,否则请咨询RFC 7230, sec 4.1ff
  • @DaSourcerer 你的意思是我们必须把数据分成块然后发送吗?
  • @Y.Prithvi 除其他外。现在正在准备完整的答案。

标签: java jsp http servlets transfer-encoding


【解决方案1】:

我认为您在这里实际上想要做的是实现Comet 的一个版本,也称为server pushing。这可以通过 Ajax 完成,但需要仔细准备。

一种方法是利用multipart/x-mixed-replace MIME 类型向客户端发送更新的内容。这方面的一个例子可以在here 找到(请注意,该示例中使用的边界不符合 MIME,恕我直言。部件之间的边界应该看起来像 {$bondary}-- 而最后一个应该是 {$boundary}&lt;CR&gt;&lt;LF&gt;) .然而,这是以 MSIE 功能受损为代价的。

可以在ajaxpatterns.org 找到一些替代方案中的可比较实现列表。无论如何,您应该确保您的输出写入器在写出一行后实际上被刷新。

【讨论】:

  • 我去看看,然后回复你。谢谢@DaSourcerer
猜你喜欢
  • 1970-01-01
  • 2010-09-06
  • 2013-09-10
  • 1970-01-01
  • 1970-01-01
  • 2018-09-24
  • 2016-02-11
  • 1970-01-01
  • 2011-07-02
相关资源
最近更新 更多