执行httpclient.execute()方法 java程序卡住不动 无法继续运行

主函数调用crawl子函数,调用第一次正常执行,调用第二次就卡住了,停滞不动,不报错但一直在运行没有结果

经过print差错发现,在crawl子函数内部的重定向后,第二次执行httpclient.execute()方法时程序卡住了,一直在运行但也不报错

crawl.java子函数代码如下:

    public String crawl(String url) {
        String result="";
        crawlRedirect = false;
        System.out.println("inside crawl");
        //禁用get重定向后自动跳转
        client.getParams().setParameter(ClientPNames.HANDLE_REDIRECTS, false);    
        HttpGet httpget = new HttpGet(url); 
        HttpResponse response;
        try {
            response = client.execute(httpget);
            System.out.println("execute over");
            if(response.getStatusLine().getStatusCode()==302){
                System.out.println("302重定向了 需要登录↓↓↓↓");
                crawlRedirect = true;      
            }
            //打开get重定向自动跳转后,再get访问一次原url
            DefaultHttpClient client2 = new DefaultHttpClient(new ThreadSafeClientConnManager());  //加入新client后程序正常
            client2.getParams().setParameter(ClientPNames.HANDLE_REDIRECTS, true); 
            System.out.println("setParameter over");
            HttpGet httpget2 = new HttpGet(url); 
            System.out.println("new http over");
            HttpResponse response2 = client2.execute(httpget2);  //原本的程序在这里会卡住,原本的clien用的是class的全局实例变量,改为新声明的client2后没有问题了
            System.out.println("execute again over");
            //System.out.println(response2.getStatusLine().toString()); // HTTP/1.1 302 Found 
            // 获取Entity  
            HttpEntity entity = response2.getEntity();  
            // 解析html
            result = EntityUtils.toString(entity);
            //打印爬取结果
            //System.out.print(result);  
        } catch (IOException e) {
            // TODO Auto-generated catch block
            System.out.print("IOException");  
            e.printStackTrace();
        }
        
        return result;
        
    }

参考文章: httpclient.execute()不执行也不报错解决办法

这段代码其实是没有任何问题的,所有的变量我都调试过,都有值,
但是就是执行到httpclient.execute()的时候就是不执行,我猜想是不是因为httpclient实例已经没有了,是不是已经被java的回收器回收了。
于是我就从新new 了一个,放了进去,将原来的cookie也放进去,就可以做到同一个cookie访问了
修改后添加代码为

按照博主的方法重新new声明了一个新的client之后就好了!!
所以到底为什么呢??之前的httpclient为什么会被收回呢?

转载于:https://my.oschina.net/u/1766462/blog/655211

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值