代码一public static String getHtml(String pageURL ,String encoding)
            throws UnsupportedEncodingException, IOException {
        //   
        StringBuffer sb = new StringBuffer();
        URL url = new URL(pageURL);
        BufferedReader in = new BufferedReader(new InputStreamReader(url
                .openStream(), encoding));
        String line;
        while ((line = in.readLine()) != null) {
            sb.append(line);
        }
        in.close();
        return sb.toString();
    }代码一介绍:该方法通过传入正确的网址和编码,返回网址里的源代码。问题:今天服务器出了问题,就卡死在这里(看红色部分,我把那里单独提出来测试了,就是那里耗时间),抓取源代码用了15秒,以前都是1秒不到。
BufferedReader in = new BufferedReader(new InputStreamReader(url.openStream(), encoding));调查与测试:通过不懈努力,把代码改成了代码二,问题算是解决了一半。
关键在于这一句conn.setConnectTimeout(500);,我把500改成 5 * 1000,结果程序用了5秒的时间返回url源代码;我又把500改成10 * 1000,结果程序用了10秒的时间返回url源代码,怎么感觉像是迟加载??代码二public static String getHtml(String pageURL ,String encoding)
            throws UnsupportedEncodingException, IOException {
        //   
        StringBuffer sb = new StringBuffer();
        URL url = new URL(pageURL);
        URLConnection conn = url.openConnection();
        conn.setConnectTimeout(500);
        InputStream inStream =  conn.getInputStream();         BufferedReader in = new BufferedReader(new InputStreamReader(inStream, "gb2312"));
        String line;
        while ((line = in.readLine()) != null) {
            sb.append(line);
        }
        in.close();
        return sb.toString();
    }
还有最重要的一条线索:在我个人的电脑里代码一没有问题,问题是出在公司的服务器。代码都没有改过。今天突然就慢了。疑问:这种情况是为什么呢,程序也有懒惰性??我想第一段代码应该有更好的解决办法,比如flush之类的吧?可是我查过api并没有此类方法。无论如何都想知道原理,希望大神指点迷津

解决方案 »

  1.   

    line = in.readLine()是阻塞读取的原因吧,服务器返回数据延迟
      

  2.   

    额,其实和后面没关系,我把代码改成这样,效果和代码一是一样的,等了60秒服务器才有反应public static String getHtml(String pageURL ,String encoding)
                throws UnsupportedEncodingException, IOException {
            //   
            StringBuffer sb = new StringBuffer();
            URL url = new URL(pageURL);
            URLConnection conn = url.openConnection();
            InputStream inStream =  conn.getInputStream(); //就是这一句有问题,服务器要执行很久
            return sb.toString();
        }
    url的网址 随便什么网址,只要是正确的,效果都一样
      

  3.   

    在服务器上用浏览器直接访问一下url看看是否正常
      

  4.   

    服务器是linux的,那边的人说没有装浏览器,只能靠程序了!!!
      

  5.   

     没人有过这种问题嘛,就算可以在服务器测试打开url的速度,那这里怎么解释呢?