ONFE 2015-12-02 14:12 采纳率: 0%
浏览 3486

如果某个网页的HTTP响应消息头中没有包含Content-Length,该如何判断流已读完而不被阻塞

如题目所言,我有一个需求,需要模拟浏览器向指定URL交互,但是在取出内容时出现了问题,大多数网页都能正常抓取,因为响应头中包含了Content-Length;当遇到响应头中没有Content-Length时,代码就跑不下去了。如果一直使用readLine()方法一直读下去,如何判断流已读取到最末尾并不发生阻塞?跪求大神指点。

 public static void main(String[] args)throws Exception 
    {
        //创建连接到www.baidu.com的套接字
        Socket s = new Socket("www.baidu.com",80);

        //从套接字中获得输出流并包装成自动刷新的打印流
        PrintWriter out = new PrintWriter(s.getOutputStream(),true);

        //向打印流中输出HTTP请求消息头
        out.println("GET / HTTP/1.1");
        out.println("Accept: */*");
        out.println("Accept-Language: zh-cn");
        out.println("Host: www.baidu.com");
        out.println("Connection: keep-alive");
        out.println();

        //获取套接字的输入流并包装成 BufferedReader
        BufferedReader bufr = new BufferedReader(new InputStreamReader(s.getInputStream(),"utf-8"));

        //获取HTTP响应头并存入HashMap
        HashMap<String, String> headers = new HashMap<String, String>();
        String line = null;
        while((line=bufr.readLine())!=null)
        {
            //当读取到空行表示响应消息头结束
            if(line.equals(""))break;

            //将 Connection:keep-alive 这样的消息头劈开
            String[] temp = line.split(":");

            //此if为了避开响应状态  HTTP/1.1 200 OK
            if(temp.length==2)
                headers.put(temp[0], temp[1]);
            else
                headers.put(line, null);
        }
        line = null;

        //将存好的响应头输出
        for(String k :headers.keySet()){
            System.out.println(k + ": " + headers.get(k));
        }
        System.out.println("------------------------------------------");

        //取出内容长度
        int sum = Integer.parseInt(headers.get("Content-Length").trim());

        char[] cbuf = new char[sum];
        int t = bufr.read(cbuf);

        System.out.println(new String(cbuf,0,t));

        bufr.close();
        s.close();
    }
  • 写回答

1条回答 默认 最新

  • threenewbee 2015-12-02 15:11
    关注

    说实话,判断不了,这也就是为什么有时候下载一个比较大的文件,你看到浏览器提示,文件大小未知,已下载xxx,然后下着下着提示下好了,打开一看文件又不完整。
    只能在特定的时间内得不到新的数据或者连接关闭就视作下载完成。

    评论

报告相同问题?

悬赏问题

  • ¥15 mmocr的训练错误,结果全为0
  • ¥15 python的qt5界面
  • ¥15 无线电能传输系统MATLAB仿真问题
  • ¥50 如何用脚本实现输入法的热键设置
  • ¥20 我想使用一些网络协议或者部分协议也行,主要想实现类似于traceroute的一定步长内的路由拓扑功能
  • ¥30 深度学习,前后端连接
  • ¥15 孟德尔随机化结果不一致
  • ¥15 apm2.8飞控罗盘bad health,加速度计校准失败
  • ¥15 求解O-S方程的特征值问题给出边界层布拉休斯平行流的中性曲线
  • ¥15 谁有desed数据集呀