httpasyncclient post异步提交post时,运行2分钟就变得很慢,该怎么解决

string postData = "access_token=" + access_
postData += "&status=" + Server.UrlEncode(GetWeather());
postData += "&pic=";
FileStream file = new FileStream("C:\\Documents and Settings\\zhengw.BAUERHOME\\桌面\\weather.png", FileMode.Open, FileAccess.Read);
BinaryReader read = new BinaryReader(file);
int count = (int)file.L
byte[] buffer = new byte[count];
read.Read(buffer, 0, buffer.Length);
string msg = Encoding.UTF8.GetString(buffer);
data = encoding.GetBytes(postData+msg);
request = (HttpWebRequest)WebRequest.Create(url);
request.Method = "POST";
request.ContentType = "multipart/form-data";
request.ContentLength = data.L
但在C# code
response = (HttpWebResponse)request.GetResponse();
时捕捉到了异常,403求解决办法!!!!------解决方案--------------------
WebClient w = new WebClient();
System.Collections.Specialized.NameValueCollection VarPost = new System.Collections.Specialized.NameValueCollection();
VarPost.Add("id", s_id);//将textBox1中的数据变为用a标识的参数,并用POST传值方式传给网页 -
//将参数列表VarPost中的所有数据用POST传值的方式传给http://申请好的域名或用IIs配置好的地址/Default.aspx,
//并将从网页上返回的数据以字节流存放到byRemoteInfo中)(注:IIS配置的时候经常没配置好会提示错误,嘿) -
w.UploadValues(".cn/api/106sms.php", "POST", VarPost);
如果您喜欢IT行业或者对IT行业感兴趣,想开拓技术视野,欢迎加入本站官方QQ群:,在群里认识新朋友和交流技术^_^
本站联系邮箱:268135人阅读
java(91)
项目经验(58)
Http协议的重要性相信不用我多说了,HttpClient相比传统JDK自带的URLConnection,增加了易用性和灵活性(具体区别,日后我们再讨论),它不仅是客户端发送Http请求变得容易,而且也方便了开发人员测试接口(基于Http协议的),即提高了开发的效率,也方便提高代码的健壮性。因此熟练掌握HttpClient是很重要的必修内容,掌握HttpClient后,相信对于Http协议的了解会更加深入。
HttpClient是Apache Jakarta Common下的子项目,用来提供高效的、最新的、功能丰富的支持HTTP协议的客户端编程工具包,并且它支持HTTP协议最新的版本和建议。HttpClient已经应用在很多的项目中,比如Apache Jakarta上很著名的另外两个开源项目Cactus和HTMLUnit都使用了HttpClient。
1. 基于标准、纯净的java语言。实现了Http1.0和Http1.1
2. 以可扩展的面向对象的结构实现了Http全部的方法(GET, POST, PUT, DELETE, HEAD, OPTIONS, and TRACE)。
3. 支持HTTPS协议。
4. 通过Http代理建立透明的连接。
5. 利用CONNECT方法通过Http代理建立隧道的https连接。
6. Basic, Digest, NTLMv1, NTLMv2, NTLM2 Session, SNPNEGO/Kerberos认证方案。
7. 插件式的自定义认证方案。
8. 便携可靠的套接字工厂使它更容易的使用第三方解决方案。
9. 连接管理器支持多线程应用。支持设置最大连接数,同时支持设置每个主机的最大连接数,发现并关闭过期的连接。
10. 自动处理Set-Cookie中的Cookie。
11. 插件式的自定义Cookie策略。
12. Request的输出流可以避免流中内容直接缓冲到socket服务器。
13. Response的输入流可以有效的从socket服务器直接读取相应内容。
14. 在http1.0和http1.1中利用KeepAlive保持持久连接。
15. 直接获取服务器发送的response code和 headers。
16. 设置连接超时的能力。
17. 实验性的支持http1.1 response caching。
18. 源代码基于Apache License 可免费获取。
三、使用方法
使用HttpClient发送请求、接收响应很简单,一般需要如下几步即可。
1.&创建HttpClient对象。
2.&创建请求方法的实例,并指定请求URL。如果需要发送GET请求,创建HttpGet对象;如果需要发送POST请求,创建HttpPost对象。
3.&如果需要发送请求参数,可调用HttpGet、HttpPost共同的setParams(HetpParams params)方法来添加请求参数;对于HttpPost对象而言,也可调用setEntity(HttpEntity entity)方法来设置请求参数。
4.&调用HttpClient对象的execute(HttpUriRequest request)发送请求,该方法返回一个HttpResponse。
5.&调用HttpResponse的getAllHeaders()、getHeaders(String name)等方法可获取服务器的响应头;调用HttpResponse的getEntity()方法可获取HttpEntity对象,该对象包装了服务器的响应内容。程序可通过该对象获取服务器的响应内容。
6.&释放连接。无论执行方法是否成功,都必须释放连接
package com.
import java.io.F
import java.io.FileInputS
import java.io.IOE
import java.io.UnsupportedEncodingE
import java.security.KeyManagementE
import java.security.KeyS
import java.security.KeyStoreE
import java.security.NoSuchAlgorithmE
import java.security.cert.CertificateE
import java.util.ArrayL
import java.util.L
import javax.net.ssl.SSLC
import org.apache.http.HttpE
import org.apache.http.NameValueP
import org.apache.http.ParseE
import org.apache.http.client.ClientProtocolE
import org.apache.http.client.entity.UrlEncodedFormE
import org.apache.http.client.methods.CloseableHttpR
import org.apache.http.client.methods.HttpG
import org.apache.http.client.methods.HttpP
import org.apache.http.conn.ssl.SSLConnectionSocketF
import org.apache.http.conn.ssl.SSLC
import org.apache.http.conn.ssl.TrustSelfSignedS
import org.apache.http.entity.ContentT
import org.apache.http.entity.mime.MultipartEntityB
import org.apache.http.entity.mime.content.FileB
import org.apache.http.entity.mime.content.StringB
import org.apache.http.impl.client.CloseableHttpC
import org.apache.http.impl.client.HttpC
import org.apache.http.message.BasicNameValueP
import org.apache.http.util.EntityU
import org.junit.T
public class HttpClientTest {
public void jUnitTest() {
* HttpClient连接SSL
public void ssl() {
CloseableHttpClient httpclient =
KeyStore trustStore = KeyStore.getInstance(KeyStore.getDefaultType());
FileInputStream instream = new FileInputStream(new File(&d:\\tomcat.keystore&));
// 加载keyStore d:\\tomcat.keystore
trustStore.load(instream, &123456&.toCharArray());
} catch (CertificateException e) {
e.printStackTrace();
} finally {
instream.close();
} catch (Exception ignore) {
// 相信自己的CA和所有自签名的证书
SSLContext sslcontext = SSLContexts.custom().loadTrustMaterial(trustStore, new TrustSelfSignedStrategy()).build();
// 只允许使用TLSv1协议
SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(sslcontext, new String[] { &TLSv1& }, null,
SSLConnectionSocketFactory.BROWSER_COMPATIBLE_HOSTNAME_VERIFIER);
httpclient = HttpClients.custom().setSSLSocketFactory(sslsf).build();
// 创建http请求(get方式)
HttpGet httpget = new HttpGet(&https://localhost:8443/myDemo/Ajax/serivceJ.action&);
System.out.println(&executing request& + httpget.getRequestLine());
CloseableHttpResponse response = httpclient.execute(httpget);
HttpEntity entity = response.getEntity();
System.out.println(&----------------------------------------&);
System.out.println(response.getStatusLine());
if (entity != null) {
System.out.println(&Response content length: & + entity.getContentLength());
System.out.println(EntityUtils.toString(entity));
EntityUtils.consume(entity);
} finally {
response.close();
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} catch (KeyManagementException e) {
e.printStackTrace();
} catch (NoSuchAlgorithmException e) {
e.printStackTrace();
} catch (KeyStoreException e) {
e.printStackTrace();
} finally {
if (httpclient != null) {
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
* post方式提交表单(模拟用户登录请求)
public void postForm() {
// 创建默认的httpClient实例.
CloseableHttpClient httpclient = HttpClients.createDefault();
// 创建httppost
HttpPost httppost = new HttpPost(&http://localhost:8080/myDemo/Ajax/serivceJ.action&);
// 创建参数队列
List formparams = new ArrayList();
formparams.add(new BasicNameValuePair(&username&, &admin&));
formparams.add(new BasicNameValuePair(&password&, &123456&));
UrlEncodedFormEntity uefE
uefEntity = new UrlEncodedFormEntity(formparams, &UTF-8&);
httppost.setEntity(uefEntity);
System.out.println(&executing request & + httppost.getURI());
CloseableHttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
if (entity != null) {
System.out.println(&--------------------------------------&);
System.out.println(&Response content: & + EntityUtils.toString(entity, &UTF-8&));
System.out.println(&--------------------------------------&);
} finally {
response.close();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭连接,释放资源
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
* 发送 post请求访问本地应用并根据传递参数不同返回不同结果
public void post() {
// 创建默认的httpClient实例.
CloseableHttpClient httpclient = HttpClients.createDefault();
// 创建httppost
HttpPost httppost = new HttpPost(&http://localhost:8080/myDemo/Ajax/serivceJ.action&);
// 创建参数队列
List formparams = new ArrayList();
formparams.add(new BasicNameValuePair(&type&, &house&));
UrlEncodedFormEntity uefE
uefEntity = new UrlEncodedFormEntity(formparams, &UTF-8&);
httppost.setEntity(uefEntity);
System.out.println(&executing request & + httppost.getURI());
CloseableHttpResponse response = httpclient.execute(httppost);
HttpEntity entity = response.getEntity();
if (entity != null) {
System.out.println(&--------------------------------------&);
System.out.println(&Response content: & + EntityUtils.toString(entity, &UTF-8&));
System.out.println(&--------------------------------------&);
} finally {
response.close();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (UnsupportedEncodingException e1) {
e1.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭连接,释放资源
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
* 发送 get请求
public void get() {
CloseableHttpClient httpclient = HttpClients.createDefault();
// 创建httpget.
HttpGet httpget = new HttpGet(&/&);
System.out.println(&executing request & + httpget.getURI());
// 执行get请求.
CloseableHttpResponse response = httpclient.execute(httpget);
// 获取响应实体
HttpEntity entity = response.getEntity();
System.out.println(&--------------------------------------&);
// 打印响应状态
System.out.println(response.getStatusLine());
if (entity != null) {
// 打印响应内容长度
System.out.println(&Response content length: & + entity.getContentLength());
// 打印响应内容
System.out.println(&Response content: & + EntityUtils.toString(entity));
System.out.println(&------------------------------------&);
} finally {
response.close();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (ParseException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
// 关闭连接,释放资源
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
* 上传文件
public void upload() {
CloseableHttpClient httpclient = HttpClients.createDefault();
HttpPost httppost = new HttpPost(&http://localhost:8080/myDemo/Ajax/serivceFile.action&);
FileBody bin = new FileBody(new File(&F:\\image\\sendpix0.jpg&));
StringBody comment = new StringBody(&A binary file of some kind&, ContentType.TEXT_PLAIN);
HttpEntity reqEntity = MultipartEntityBuilder.create().addPart(&bin&, bin).addPart(&comment&, comment).build();
httppost.setEntity(reqEntity);
System.out.println(&executing request & + httppost.getRequestLine());
CloseableHttpResponse response = httpclient.execute(httppost);
System.out.println(&----------------------------------------&);
System.out.println(response.getStatusLine());
HttpEntity resEntity = response.getEntity();
if (resEntity != null) {
System.out.println(&Response content length: & + resEntity.getContentLength());
EntityUtils.consume(resEntity);
} finally {
response.close();
} catch (ClientProtocolException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
} finally {
httpclient.close();
} catch (IOException e) {
e.printStackTrace();
本实例是采用HttpClient4.3最新版本。该版本与之前的代码写法风格相差较大,大家多留意下。
* 以上用户言论只代表其个人观点,不代表CSDN网站的观点或立场
访问:1135425次
积分:9149
积分:9149
排名:第1079名
原创:111篇
评论:808条最近本人在一个项目中碰到比较严重的性能问题。花了一些时间,试了几套方案进行改进。最核心问题就是高并发http请求并发数低。下面给出解决问题的过程。本人经验有限,如果广大屌丝java程序员的粉丝,你们如果有更好的意见和建议欢迎给我留言。好了废话不多说了。介绍下一些环境资源JDK版本:1.7项目框架:jfinal 1.9,容器:jetty 9.2网络环境:移动10M宽带笔记本:i7 3610QM 4核8线程 16G内存。在Intellij 上使用Jetty9.2,运行参数:-Xms=1024m -Xmx=1024m测试机:i3 双核4线程 4G内存 Ubuntu14.04 运行Apache Jmeter2.11 1000个线程 各5次请求
下面是项目大概的一个模型:从用户角度看,完成request到接收response的时间为jvm内部处理时间+http请求Redis 网络IO时间 + https请求远程服务器 网络IO时间 +用户本身request和服务器response返回的网络IO时间。实际本地测试,https请求响应时间大约110ms~350ms 波动。使用REST Client工具测试。第一阶段:使用多线程Future模型+普通HttpClient请求。关键代码:将Callable提交到线程池里,返回Future对象。Future一旦有值时,就通过调用Jfinal的renderText()输出下面就是使用HttpClient进行请求测试结果:通过实际测试,并发从一开始36/sec逐渐降到10/sec。在控制台看到不少链接超时的异常信息。不少远程http请求Redis服务耗时竟然超过30s。原因分析:Http连接Redis服务,虽然在正常情况下每次都能迅速响应,大约80ms-120ms(本地环境)。生产环境可以保证Redis和项目响应速度更快,但是在大量http请求下,由于目前代码效率不高,请求若是不能及时处理完,就会导致后面http请求延迟响应。改善:引入google guava框架,利用其中的Cache功能,因为带有expireAfterWrite功能。把guava cache服务当成1级缓存,Redis服务当成2级缓存。并且增加保证cache内各对象失效时间早于Redis内存储的失效时间,并且cache能够及时从Redis更新.这样减少了Http请求Redis的网络开销。第二阶段:引入guava框架后,改善显著。关键代码:一开始预设1000秒过期。cache 内的对象如果过期了,需要重新设置过期时间,过期时间需要动态计算服务器当前时间和Redis内保存的时间差值,保证cache内的对象不会旧于Redis。这样在多实例中,guava的cache充当了1级缓存。测试结果: 并发果然大大提高,大约可以上到57/sec.本来两次Http请求,由于引入了guava缓存,变成了一次https请求。效率当然提高了。但是仍然不是很满意,因为测试过程中error率大约有0.3%。而且观察日志,不少请求费时有50s,甚至有120s。测试时发现jetty在运行过程中,会发生停顿现象,所谓的停顿就是完全没有响应。熟悉jvm垃圾回收的朋友应该知道,这个时候jvm发生了Full GC,GC过程中会对导致程序运行中断。原因分析:1.大量http请求堆积,需要限制访问httpClient.execute方法的数量。避免引起阻塞。2.降低或避免Full GC,要对jvm运行参数进行调优。但是在生产环境中(微软云,Paas服务),却无法配置jvm运行参数(可能我暂时不知道吧)。措施:引入Java多线程信号量SemaphoreSemaphore(信号量)是用来控制同时访问特定资源的线程数量,它通过协调各个线程,以保证合理的使用公共资源通俗的讲:就是公园大门就10扇门,来了1000人都争先恐后的挤破脑袋想进去,结果都挤在一堆了乱哄哄的,没见的有多少人能进去。Semaphore就是做了一个控制管理,比如规定每次只能放10人进行来,其它人只能等,处理完一个,后面就跟上,直到全部处理完。这样比一堆人哄在门口要有效率的多。(Semaphore 在本公众号早些时候有专门文章讲解的)对于本应用来说,Semaphore的值太低是不行的,太高也不行。关键代码:采用了公平模式acquire() 获得锁release() 释放锁测试了几个数字发现当Semaphore = 200时,并发数比较高。测试结果:公平模式大约68.7/sec,峰值可以上到110/sec,错误率0%,果然通过控制访问httpClient.execute方法的数量,能提高并发数。在测试过程中,仍然发生了好几次Full gc(),把并发数给降了下来。第三阶段:上Apache网站上发现HttpAsyncClient框架HttpAsyncClient may be of interest to anyone building HTTP-aware client applications based on asynchronous, event driven I/O model.OSChina上这样介绍的HttpAsyncClient 的出现并不是为了替换 HttpClient,而是作为一个补充用于需要大量并发连接,对性能要求非常高的基于HTTP的原生数据通信,而且提供了事件驱动的 API。关键代码:改造Post请求方法连接池初始化以及单例模式直接返回Future对象!查看源码,还有另外一个惊喜,不需要再对SSL写一堆东西了。注意:使用HttpAsyncClient后不再使用Semaphore了。测试结果:每秒稳定80/sec~85/sec,而且jvm几乎没有停顿过。5000个请求很快就跑完了。而且最大延迟也就7s.==============================================================问题:80/sec并发,在上述配置下面属于比较好,还是比较差?还能提高多少空间?或者测试方法有没有问题?注:https服务器,其实是某讯的服务器。你懂得。欢迎广大java程序员提供建议和意见,欢迎拍砖。=============================================================
推荐一个不错的微信公众号:【菜鸟要飞】专注于分享最全的编程开发视频学习资料和学习经验。目前已整理的视频有c/c++,游戏开发,Android,ios,windowsphone8,javaweb,asp.net,php,黑客技术,Hadoop,javascript等 
 文章为作者独立观点,不代表微头条立场
的最新文章
据新华社报道,美国航空航天局(NASA)近日发布消息,称开普勒太空望远镜发现了一颗与地球类似的行星开普勒-4猿圈 (ID: CodePush )(←长按复制) 为程序员提供最优质的博文、最精彩的讨论、最实用的开发资源猿圈 (ID: CodePush )(←长按复制) 为程序员提供最优质的博文、最精彩的讨论、最实用的开发资源最近本人在一个项目中碰到比较严重的性能问题。花了一些时间,试了几套方案进行改进。最核心问题就是高并发http线上服务器负载过高发生了报警,同事找我求救。我看到机器的负载都超过20了,查看java进程线程栈,找到了出问此文为转载,虽然写的是PHP,但是思路同样值得javaer参考!电商平台多用户商城系统架构行业现状浏览全球知一、SpringMVC基础入门,创建一个HelloWorld程序1.首先,导入SpringMVC需要的jarjava_diaosiJava语言,Java设计模式,API详解,多线程,Java开源软件,Java最新进展,国外优秀框架Blog译文,IT人趣闻热门文章最新文章java_diaosiJava语言,Java设计模式,API详解,多线程,Java开源软件,Java最新进展,国外优秀框架Blog译文,IT人趣闻httpasyncclient异步提交post时,运行2分钟就变得很慢,该怎么解决_百度知道
httpasyncclient异步提交post时,运行2分钟就变得很慢,该怎么解决
运行不了,少一个类,既然不报错,就看看是不是权限,网络,防火墙之类的问题。或者换个url试试
知道智能回答机器人
我是知道站内的人工智能,可高效智能地为您解答问题。很高兴为您服务。
其他类似问题
为您推荐:
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁}

我要回帖

更多关于 asynchttpclient 下载 的文章

更多推荐

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

点击添加站长微信