response = httpclient.execute 出错;无反应怎么回事

HttpClient学习系列 -- 学习总结 - hry - ITeye博客
博客分类:
HttpClient 4.x版本
HttpComponents 包括 HttpCore包和HttpClient包
HttpClient:Http的执行http请求
DefaultHttpClient:httpClient默认实现
HttpGet、HttpPost:Get、Post方法执行类
HttpResponse:执行返回的Response,含http的header和执行结果实体Entity
HttpEntity:Http返回结果实体,不含Header内容
HttpParam:连接参数,配合连接池使用
PoolingClientConnectionManager:连接池
基础Get方法
// 默认的client类。
HttpClient client = new DefaultHttpClient();
// 设置为get取连接的方式.
HttpGet get = new HttpGet(url);
// 得到返回的response.
HttpResponse response = client.execute(get);
// 得到返回的client里面的实体对象信息.
HttpEntity entity = response.getEntity();
if (entity != null) {
System.out.println( entity.getContentEncoding());
System.out.println( entity.getContentType());
// 得到返回的主体内容.
InputStream instream = entity.getContent();
BufferedReader reader = new BufferedReader(new InputStreamReader(instream, encoding));
System.out.println(reader.readLine());
// EntityUtils 处理HttpEntity的工具类
// System.out.println(EntityUtils.toString(entity));
// 关闭连接.
client.getConnectionManager().shutdown();
基础Post方法
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpPost httpost = new HttpPost(url);
// 添加参数
List&NameValuePair& formparams = new ArrayList&NameValuePair&();
formparams.add(new BasicNameValuePair("p", "1"));
formparams.add(new BasicNameValuePair("t", "2"));
formparams.add(new BasicNameValuePair("e", "3"));
UrlEncodedFormEntity urlEntity =
new UrlEncodedFormEntity(formparams, "UTF-8");
httpost.setEntity(urlEntity);
HttpResponse response = httpclient.execute(httpost);
HttpEntity entity = response.getEntity();
System.out.println("Login form get: " + response.getStatusLine() + entity.getContent());
// dump(entity, encoding);
System.out.println("Post logon cookies:");
List&Cookie& cookies = httpclient.getCookieStore().getCookies();
for (int i = 0; i & cookies.size(); i++) {
System.out.println("- " + cookies.get(i).toString());
// 关闭请求
httpclient.getConnectionManager().shutdown();
保留Session,保留用户+密码状态
Demo1,只支持单线程
DefaultHttpClient httpclient = new DefaultHttpClient(
new ThreadSafeClientConnManager());
HttpPost httpost = new HttpPost(url);
// 添加参数
List&NameValuePair& formparams = new ArrayList&NameValuePair&();
formparams.add(new BasicNameValuePair("p", "1"));
formparams.add(new BasicNameValuePair("t", "2"));
formparams.add(new BasicNameValuePair("e", "3"));
// 设置请求的编码格式
httpost.setEntity(new UrlEncodedFormEntity(formparams, Consts.UTF_8));
// 登录一遍
httpclient.execute(httpost);
// 然后再第二次请求普通的url即可。
httpost = new HttpPost(url2);
BasicResponseHandler responseHandler = new BasicResponseHandler();
System.out.println(httpclient.execute(httpost, responseHandler));
httpclient.getConnectionManager().shutdown();
return "";
Demo2:第二次请求带上第一次请求的Cookie
用于在用户+密码等候后,后续根据第一次请求的URL获取的Cookie,把这些Cookie添加到第二次请求的Cookie中
DefaultHttpClient httpclient = new DefaultHttpClient();
HttpPost httpost = new HttpPost(url);
// 添加参数
List&NameValuePair& formparams = new ArrayList&NameValuePair&();
formparams.add(new BasicNameValuePair("uname", name));
formparams.add(new BasicNameValuePair("pass", "e0c10ff76cb85"));
formparams.add(new BasicNameValuePair("auto_login","0"));
formparams.add(new BasicNameValuePair("a","1"));
formparams.add(new BasicNameValuePair("backurl","1"));
UrlEncodedFormEntity urlEntity =
new UrlEncodedFormEntity(formparams, "UTF-8");
httpost.setEntity(urlEntity);
HttpContext localContext = new BasicHttpContext();
HttpResponse response = httpclient.execute(httpost,localContext);
HttpEntity entity = response.getEntity();
// 打印获取值
System.out.println(Arrays.toString(response.getAllHeaders()));
System.out.println(EntityUtils.toString(entity));
// 第二次请求,使用上一次请求的Cookie
DefaultHttpClient httpclient2 = new DefaultHttpClient();
HttpPost httpost2 = new HttpPost("/?_c=index&_a=my");
// 获取上一次请求的Cookie
CookieStore cookieStore2 = httpclient2.getCookieStore();
// 下一次的Cookie的值,将使用上一次请求
CookieStore cookieStore = httpclient.getCookieStore();
List&Cookie& list = cookieStore.getCookies();
for(Cookie o : list){
System.out.println(o.getName() + " = " + o.getValue() + " 12");;
cookieStore2.addCookie(o);
HttpResponse response2 = httpclient2.execute(httpost2);
HttpEntity entity2 = response2.getEntity();
System.out.println(Arrays.toString(response2.getAllHeaders()));
System.out.println(EntityUtils.toString(entity2));
获取访问上下文:
HttpClient httpclient = new DefaultHttpClient();
// 设置为get取连接的方式.
HttpGet get = new HttpGet(url);
HttpContext localContext = new BasicHttpContext();
// 得到返回的response.第二个参数,是上下文,很好的一个参数!
httpclient.execute(get, localContext);
// 从上下文中得到HttpConnection对象
HttpConnection con = (HttpConnection) localContext
.getAttribute(ExecutionContext.HTTP_CONNECTION);
System.out.println("socket超时时间:" + con.getSocketTimeout());
// 从上下文中得到HttpHost对象
HttpHost target = (HttpHost) localContext
.getAttribute(ExecutionContext.HTTP_TARGET_HOST);
System.out.println("最终请求的目标:" + target.getHostName() + ":"
+ target.getPort());
// 从上下文中得到代理相关信息.
HttpHost proxy = (HttpHost) localContext
.getAttribute(ExecutionContext.HTTP_PROXY_HOST);
if (proxy != null)
System.out.println("代理主机的目标:" + proxy.getHostName() + ":"
+ proxy.getPort());
System.out.println("是否发送完毕:"
+ localContext.getAttribute(ExecutionContext.HTTP_REQ_SENT));
// 从上下文中得到HttpRequest对象
HttpRequest request = (HttpRequest) localContext
.getAttribute(ExecutionContext.HTTP_REQUEST);
System.out.println("请求的版本:" + request.getProtocolVersion());
Header[] headers = request.getAllHeaders();
System.out.println("请求的头信息: ");
for (Header h : headers) {
System.out.println(h.getName() + "--" + h.getValue());
System.out.println("请求的链接:" + request.getRequestLine().getUri());
// 从上下文中得到HttpResponse对象
HttpResponse response = (HttpResponse) localContext
.getAttribute(ExecutionContext.HTTP_RESPONSE);
HttpEntity entity = response.getEntity();
if (entity != null) {
System.out.println("返回结果内容编码是:" + entity.getContentEncoding());
System.out.println("返回结果内容类型是:" + entity.getContentType());
连接池和代理:
每次使用最后一句new DefaultHttpClient(cm, httpParams);获取新的HttpClient
里面还有一条如何设置代理
// HttpParams
HttpParams httpParams
= new BasicHttpParams();
// HttpConnectionParams 设置连接参数
// 设置连接超时时间
HttpConnectionParams.setConnectionTimeout(httpParams, 30000);
// 设置读取超时时间
HttpConnectionParams.setSoTimeout(httpParams, 60000);
SchemeRegistry schemeRegistry = new SchemeRegistry();
schemeRegistry.register(
new Scheme("http", 80, PlainSocketFactory.getSocketFactory()));
schemeRegistry.register(
new Scheme("https", 443, SSLSocketFactory.getSocketFactory()));
PoolingClientConnectionManager cm = new PoolingClientConnectionManager(schemeRegistry);
// 设置最大连接数
cm.setMaxTotal(200);
// 设置每个路由默认最大连接数
cm.setDefaultMaxPerRoute(20);
// 设置代理和代理最大路由
HttpHost localhost = new HttpHost("locahost", 80);
cm.setMaxPerRoute(new HttpRoute(localhost), 50);
// 设置代理,
HttpHost proxy = new HttpHost("10.36.24.3", 60001);
httpParams.setParameter(ConnRoutePNames.DEFAULT_PROXY,
HttpClient httpClient = new DefaultHttpClient(cm, httpParams);
如果某次请求请求失败,可以自动重连
DefaultHttpClient httpClient = new DefaultHttpClient();
// 可以自动重连
HttpRequestRetryHandler requestRetryHandler2 = new HttpRequestRetryHandler() {
// 自定义的恢复策略
public synchronized boolean retryRequest(IOException exception, int executionCount, HttpContext context) {
// 设置恢复策略,在发生异常时候将自动重试3次
if (executionCount & 3) {
// 超过最大次数则不需要重试
if (exception instanceof NoHttpResponseException) {
// 服务停掉则重新尝试连接
if (exception instanceof SSLHandshakeException) {
// SSL异常不需要重试
HttpRequest request = (HttpRequest) context.getAttribute(ExecutionContext.HTTP_REQUEST);
boolean idempotent = (request instanceof HttpEntityEnclosingRequest);
if (!idempotent) {
// 请求内容相同则重试
httpClient.setHttpRequestRetryHandler(requestRetryHandler2);
使用自定义ResponseHandler处理返回的请求
HttpClient httpClient = new DefaultHttpClient();
HttpGet get = new HttpGet(url);
// 定义一个类处理URL返回的结果
ResponseHandler&byte[]& handler = new ResponseHandler&byte[]&() {
public byte[] handleResponse(HttpResponse response)
throws ClientProtocolException, IOException {
HttpEntity entity = response.getEntity();
if (entity != null) {
return EntityUtils.toByteArray(entity);
// 不同于 httpClient.execute(request),返回值是HttpResponse;返回值右ResponseHandler决定
byte[] charts = httpClient.execute(get, handler);
FileOutputStream out = new FileOutputStream(fileName);
out.write(charts);
out.close();
httpClient.getConnectionManager().shutdown();
浏览 23014
huangrongyou
浏览: 230763 次
来自: 杭州
使用apache ActiveMQ深入企业级程序设计百度网盘: ...
能不能 提供一下 包
写的很好,很有用,谢谢
顶。谢谢分享
您好,我也用到同样的功能了,但是我的15:14:20,838response = httpclient.execute(httppost); 无反应怎么回事
签到天数: 1 天连续签到: 1 天[LV.1]初来乍到主题帖子e币
访问下 你的http://192.168.1.1/MyService 看能不能打开
但不知为何手机浏览器中也不能访问
我是手机和运行服务端程序的笔记本电脑,连入同一个无线路由器,组成的局域网
签到天数: 1 天连续签到: 1 天[LV.1]初来乍到主题帖子e币
代码貌似没有问题,感觉跟6楼说的一样,如果你用手机测试的,你可以用手机浏览器打开你的链接试试 ...
但不知为何手机浏览器中也不能访问
我是手机和运行服务端程序的笔记本电脑,连入同一个无线路由器,组成的局域网
貌似就是不能处于同一个局域网,这块真是坑爹,不知道楼主是否解决了?&
该用户从未签到主题帖子e币
同求,遇到了相同的问题。。。。。
该用户从未签到主题帖子e币
本帖最后由 AndroidGuest 于
14:45 编辑
哥们,刚刚在网上查了一下,我的问题已经解决,不知道咱俩的是否一样,
在onCreat方法中加入:
& && && && && & StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()
& && &&&.detectDiskReads()
& && &&&.detectDiskWrites()
& && &&&.detectNetwork()& &// or .detectAll() for all detectable problems
& && &&&.penaltyLog()
& && &&&.build());
& && &&&StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()
& && && && && & .detectLeakedSqlLiteObjects()
& && && && && & .detectLeakedClosableObjects()
& && && && && & .penaltyLog()
& && && && && & .penaltyDeath()
& && && && && & .build());
你太棒了 我看见networkonmain 的exception,没有想到是这个原因android阻止了post请求。&
我的也是 你好棒哦&
我的问题也是这样 解决了 太感谢了亲&
签到天数: 15 天连续签到: 2 天[LV.4]偶尔看看III主题帖子e币
呃,我说了啊。在这行代码之前就卡住不执行了,执行不到这里
我的程序也是,偶尔会在httpclient.execute(url)这里卡住
该用户从未签到主题帖子e币
但不知为何手机浏览器中也不能访问
我是手机和运行服务端程序的笔记本电脑,连入同一个无线路由器,组成 ...
貌似就是不能处于同一个局域网,这块真是坑爹,不知道楼主是否解决了?
签到天数: 11 天连续签到: 5 天[LV.3]偶尔看看II主题帖子e币
设置连接超时,试了不?
签到天数: 1 天连续签到: 1 天[LV.1]初来乍到主题帖子e币
哥们,刚刚在网上查了一下,我的问题已经解决,不知道咱俩的是否一样,
在onCreat方法中加入:
& && && && &...
你太棒了 我看见networkonmain 的exception,没有想到是这个原因android阻止了post请求。
签到天数: 7 天连续签到: 1 天[LV.3]偶尔看看II主题帖子e币
兄弟&&怎么解决的 你不是开线程处理这个问题进行网络连接的吗?&&怎么会在主线程呢?
社区认证会员
社区认证会员
QQ已认证,此人靠谱
推荐阅读热门话题
61886420384328283281261252226218208204201192715
半小时前1&小时前3&小时前昨天&23:59昨天&17:55昨天&16:11昨天&13:59昨天&10:21昨天&09:57昨天&09:45前天&23:27前天&23:05前天&20:56前天&16:54前天&16:05前天&16:02
Powered by
扫一扫 关注eoe官方微信httpclient.execute长时间停滞的解决办法
我的图书馆
httpclient.execute长时间停滞的解决办法
本帖最后由 nos 于
18:01 编辑
原文地址:/ruanko-express_21/webpage/tech8.html
httpclient.execute(httpget)这个方法在进行联网操作的时候,有时会遇到异常情况(比如我遇到
unknownHostException)致使此方法长时间运行,这个时候前面所设置的timeout参数均不起作用,最后在网上找到了一个解决办法分
享给大家,原文如下:
最近在做一个android上的项目时,这个项目上有一项程序检测升级的功能,其中使用了apache的httpclient,在使用
httpclient时,httpclient.execute(httpget)这个方法返回一个response对象,但是由于一些原因比如找不见
httpget中url。或者url错误,导致httpclient.execute这个方法就会一直等待不会继续执行下面的程序,为了避免程序不卡在
httpclient.execute这,我们把httpclient.execute放在一个线程中,让程序继续往下走,可以通过
httpclient.execute返回对象是否为空来判断是否连接服务器的地址。& && && && && &
& && && && && && && &&&Thread hth = new Thread() {
& & & & & & & & & & & & @Override
& & & & & & & & & & & & public void run() {
& & & & & & & & & & & & & & & & try {
& & & & & & & & & & & & & & & & & & & & response = client.execute(get);
& & & & & & & & & & & & & & & & } catch (IllegalArgumentException ec) {
& & & & & & & & & & & & & & & & & & & & response =
& & & & & & & & & & & & & & & & & & & & interrupted();
& & & & & & & & & & & & & & & & } catch (ClientProtocolException e) {
& & & & & & & & & & & & & & & & & & & & response =
& & & & & & & & & & & & & & & & & & & & interrupted();
& & & & & & & & & & & & & & & & } catch (IOException e) {
& & & & & & & & & & & & & & & & & & & & response =
& & & & & & & & & & & & & & & & & & & & interrupted();
& & & & & & & & & & & & & & & & }
& & & & & & & & & & & & }
& & & & & & & & };
& & & & & & & & hth.start();
& & & & & & & & try {
& & & & & & & & & & & & Thread.sleep(5000);
& & & & & & & & & & & & if (response == null) {
& & & & & & & & & & & & & & & & hth.interrupt();
& & & & & & & & & & & & & & & &
& & & & & & & & & & & & }
& & & & & & & & } catch (InterruptedException e) {
& & & & & & & & & & & & e.printStackTrace();
& & & & & & & & }
& & & & & & & & if (response.getStatusLine().getStatusCode() == 200) {
& & & & & & & & & & & &&&return getDom(response.getEntity().getContent());
& & & & & & & & }复制代码
TA的最新馆藏2014年8月 移动开发大版内专家分月排行榜第三
本帖子已过去太久远了,不再提供回复功能。本帖子已过去太久远了,不再提供回复功能。}

我要回帖

更多关于 client.execute 出错 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信