下载功能,当用户点击下载,弹出“保存,取消”的框后,如果用户不做任何点击,此时,服务器servlet的out.write不会hold住

package com.demo;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

import org.apache.log4j.Logger;

public class DownloadServlet extends HttpServlet {

    public static Logger      log              = Logger.getLogger(DownloadServlet.class);

    private static final long serialVersionUID = 1L;

    /**
     * 实验:下载功能,当用户点击下载,弹出“保存,取消”的框后,如果用户不做任何点击,<br>
     * 此时,服务器servlert的out.write是会hold住吗? 还是能继续输出?
     * http://topic.csdn.net/u/20110915/09/7f162e68-7632-4985-9aab-920bb06df2cc
     * .html?seed=1489779347&r=75525057#r_75525057
     * 
     * (错误,请忽略)飞飞说,应该是cache在操作系统中(Socket内核相关)。我write了260M数据,看到java占用内存还是70M,所以确实有可能。
     */
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        // 设置响应头信息,下载的文件
        String contentType = "application/octet-stream;charset=GBK";
        String contentDisposition = "attachment; filename=\"demo.txt\"";
        response.setContentType(contentType);
        response.setHeader("Content-disposition", contentDisposition);
        
        //response buffer
        log.error(response.getBufferSize());
        response.setBufferSize(1);
        log.error(response.getBufferSize());

        OutputStream os = response.getOutputStream();
        PrintWriter pw = new PrintWriter(os);
        Long i = 0L;
        while (i++ < 10000000L) {// 260M的文件
            pw.println("some test content.........");//
            pw.flush();
        }
        pw.close();
//        response.

        
        
        // 即使不点击“保存”,也不会hold住,会继续输出下列log。而且,隔了30分钟后再点击“保存”,竟然还能下载成功。
        log.error("outputstream closed! come here!");

    }

}

 

demo见附件。

 

 

结论:

曹帅解答了我的疑惑,只要用户点击了下载资源的Url,无论用户是否点击“保 存”,浏览器会马上开始下载完整的response的(使用httpfox看确实是这样,我没点击“保存”它就已经下载完文件了),不管你是否点击保存, 保存的行为只是浏览器将下载完或正在下载的内容存到用户指定的文件中而已。( 再说,HTTP协议本身就是request/response,不可能还能根据用户是否点击保存的行为而Hold住的。) 同时,想想wget,是直接就下载吧,没有hold的。

 

 

20120301补充:后来验证过,ie和firefox行为不一样,iE会hold住。看来。。。结论还是:因浏览器而异!

(IE这么做,我一开始觉得不对劲,但是后来觉得还是合理的,想想做web im常用的comet方式,就是js在浏览器端发起请求,服务端若无数据就Blocked几十秒再返回响应。http没谈到请求/响应的时间间隙,故在请求和响应过程中,其中一方选择blocked,导致tcp暂时无数据传输(除了滑动窗口心跳通讯),也是合理的)

 

你可能感兴趣的:(java,servlet,socket)