httpclient4 中文版帮助文档

httpclient4 中文版帮助文档
httpclient4 中文版帮助文档

httpclient4 中文版帮助文档,最新官方版翻译版

前言

超文本传输协议(HTTP)也许是当今互联网上使用的最重要的协议了。Web服务,有网络功能的设备和网络计算的发展,都持续扩展了HTTP协议的角色,超越了用户使用的Web 浏览器范畴,同时,也增加了需要HTTP协议支持的应用程序的数量。

尽管https://www.360docs.net/doc/7e16004385.html,包提供了基本通过HTTP访问资源的功能,但它没有提供全面的灵活性和其它很多应用程序需要的功能。HttpClient就是寻求弥补这项空白的组件,通过提供一个有效的,保持更新的,功能丰富的软件包来实现客户端最新的HTTP标准和建议。

为扩展而设计,同时为基本的HTTP协议提供强大的支持,HttpClient组件也许就是构建HTTP客户端应用程序,比如web浏览器,web服务端,利用或扩展HTTP协议进行分布式通信的系统的开发人员的关注点。

1. HttpClient的范围

基于HttpCore[https://www.360docs.net/doc/7e16004385.html,/httpcomponents-core/index.html]的客户端HTTP运输实现库

基于经典(阻塞)I/O

内容无关

2. 什么是HttpClient不能做的

HttpClient 不是一个浏览器。它是一个客户端的HTTP通信实现库。HttpClient的目标是发送和接收HTTP报文。HttpClient不会去缓存内容,执行嵌入在HTML页面中的javascript 代码,猜测内容类型,重新格式化请求/重定向URI,或者其它和HTTP运输无关的功能。

第一章基础

1.1 执行请求

HttpClient 最重要的功能是执行HTTP方法。一个HTTP方法的执行包含一个或多个HTTP请求/HTTP响应交换,通常由HttpClient的内部来处理。而期望用户提供一个要执行的请求对象,而HttpClient期望传输请求到目标服务器并返回对应的响应对象,或者当执行不成功时抛出异常。

很自然地,HttpClient API的主要切入点就是定义描述上述规约的HttpClient接口。

这里有一个很简单的请求执行过程的示例:

HttpClient httpclient = new DefaultHttpClient();

HttpGet httpget = new HttpGet("http://localhost/");

HttpResponse response = httpclient.execute(httpget);

HttpEntity entity = response.getEntity();

if (entity != null) {

InputStream instream = entity.getContent();

int l;

byte[] tmp = new byte[2048];

while ((l = instream.read(tmp)) != -1) {

}

}

1.1.1 HTTP请求

所有HTTP请求有一个组合了方法名,请求URI和HTTP协议版本的请求行。HttpClient 支持所有定义在HTTP/1.1版本中的HTTP方法:GET,HEAD,POST,PUT,DELETE,TRACE和OPTIONS。对于每个方法类型都有一个特殊的类:HttpGet,HttpHead,HttpPost,HttpPut,HttpDelete,HttpTrace和HttpOptions。

请求的URI是统一资源定位符,它标识了应用于哪个请求之上的资源。HTTP请求URI包含一个协议模式,主机名称,可选的端口,资源路径,可选的查询和可选的片段。HttpGet httpget = new HttpGet(

"https://www.360docs.net/doc/7e16004385.html,/search?hl=en&q=httpclient&btnG=Google+Search&aq=f&oq=" );

HttpClient提供很多工具方法来简化创建和修改执行URI。

URI也可以编程来拼装:

URI uri = URIUtils.createURI("http", "https://www.360docs.net/doc/7e16004385.html,", -1, "/search",

"q=httpclient&btnG=Google+Search&aq=f&oq=", null);

HttpGet httpget = new HttpGet(uri);

System.out.println(httpget.getURI());

输出内容为:

https://www.360docs.net/doc/7e16004385.html,/search?q=httpclient&btnG=Google+Search&aq=f&oq=

查询字符串也可以从独立的参数中来生成:

List qparams = new ArrayList();

qparams.add(new BasicNameValuePair("q", "httpclient"));

qparams.add(new BasicNameValuePair("btnG", "Google Search"));

qparams.add(new BasicNameValuePair("aq", "f"));

qparams.add(new BasicNameValuePair("oq", null));

URI uri = URIUtils.createURI("http", "https://www.360docs.net/doc/7e16004385.html,", -1, "/search", URLEncodedUtils.format(qparams, "UTF-8"), null);

HttpGet httpget = new HttpGet(uri);

System.out.println(httpget.getURI());

输出内容为:

https://www.360docs.net/doc/7e16004385.html,/search?q=httpclient&btnG=Google+Search&aq=f&oq=

1.1.2 HTTP响应

HTTP响应是由服务器在接收和解释请求报文之后返回发送给客户端的报文。响应报文的第一行包含了协议版本,之后是数字状态码和相关联的文本段。

HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "OK");

System.out.println(response.getProtocolVersion());

System.out.println(response.getStatusLine().getStatusCode());

System.out.println(response.getStatusLine().getReasonPhrase());

System.out.println(response.getStatusLine().toString());

输出内容为:

HTTP/1.1

200

OK

HTTP/1.1 200 OK

1.1.3 处理报文头部

一个HTTP报文可以包含很多描述如内容长度,内容类型等信息属性的头部信息。HttpClient提供获取,添加,移除和枚举头部信息的方法。

HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "OK");

response.addHeader("Set-Cookie",

"c1=a; path=/; domain=localhost");

response.addHeader("Set-Cookie",

"c2=b; path=\"/\", c3=c; domain=\"localhost\"");

Header h1 = response.getFirstHeader("Set-Cookie");

System.out.println(h1);

Header h2 = response.getLastHeader("Set-Cookie");

System.out.println(h2);

Header[] hs = response.getHeaders("Set-Cookie");

System.out.println(hs.length);

输出内容为:

Set-Cookie: c1=a; path=/; domain=localhost

Set-Cookie: c2=b; path="/", c3=c; domain="localhost"

获得给定类型的所有头部信息最有效的方式是使用HeaderIterator接口。HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "OK");

response.addHeader("Set-Cookie",

"c1=a; path=/; domain=localhost");

response.addHeader("Set-Cookie",

"c2=b; path=\"/\", c3=c; domain=\"localhost\"");

HeaderIterator it = response.headerIterator("Set-Cookie");

while (it.hasNext()) {

System.out.println(it.next());

}

输出内容为:

Set-Cookie: c1=a; path=/; domain=localhost

Set-Cookie: c2=b; path="/", c3=c; domain="localhost"

它也提供解析HTTP报文到独立头部信息元素的方法方法。

HttpResponse response = new BasicHttpResponse(HttpVersion.HTTP_1_1, HttpStatus.SC_OK, "OK");

response.addHeader("Set-Cookie",

"c1=a; path=/; domain=localhost");

response.addHeader("Set-Cookie",

"c2=b; path=\"/\", c3=c; domain=\"localhost\"");

HeaderElementIterator it = new BasicHeaderElementIterator(

response.headerIterator("Set-Cookie"));

while (it.hasNext()) {

HeaderElement elem = it.nextElement();

System.out.println(elem.getName() + " = " + elem.getValue());

NameValuePair[] params = elem.getParameters();

for (int i = 0; i < params.length; i++) {

System.out.println(" " + params[i]);

}

}

输出内容为:

c1 = a

path=/

domain=localhost

c2 = b

path=/

c3 = c

domain=localhost

1.1.4 HTTP实体

HTTP 报文可以携带和请求或响应相关的内容实体。实体可以在一些请求和响应中找到,因为它们也是可选的。使用了实体的请求被称为封闭实体请求。HTTP规范定义了两种封闭实体的方法:POST和PUT。响应通常期望包含一个内容实体。这个规则也有特例,比如HEAD方法的响应和204 No Content,304 Not Modified和205 Reset Content响应。HttpClient根据其内容出自何处区分三种类型的实体:

streamed流式:内容从流中获得,或者在运行中产生。特别是这种分类包含从HTTP响应中获取的实体。流式实体是不可重复生成的。

self-contained自我包含式:内容在内存中或通过独立的连接或其它实体中获得。自我包含式的实体是可以重复生成的。这种类型的实体会经常用于封闭HTTP请求的实体。wrapping包装式:内容从另外一个实体中获得。

当从一个HTTP响应中获取流式内容时,这个区别对于连接管理很重要。对于由应用程序创建而且只使用HttpClient发送的请求实体,流式和自我包含式的不同就不那么重要了。这种情况下,建议考虑如流式这种不能重复的实体,和可以重复的自我包含式实体。

1.1.4.1 重复实体

实体可以重复,意味着它的内容可以被多次读取。这就仅仅是自我包含式的实体了(像ByteArrayEntity或StringEntity)。

1.1.4.2 使用HTTP实体

因为一个实体既可以代表二进制内容又可以代表字符内容,它也支持字符编码(支持后者也就是字符内容)。

实体是当使用封闭内容执行请求,或当请求已经成功执行,或当响应体结果发功到客户端时

创建的。

要从实体中读取内容,可以通过HttpEntity#getContent()方法从输入流中获取,这会返回一个java.io.InputStream对象,或者提供一个输出流到HttpEntity#writeTo(OutputStream)方法中,这会一次返回所有写入到给定流中的内容。

当实体通过一个收到的报文获取时,HttpEntity#getContentType()方法和

HttpEntity#getContentLength()方法可以用来读取通用的元数据,如Content-Type和Content-Length 头部信息(如果它们是可用的)。因为头部信息Content-Type可以包含对文本MIME类型的字符编码,比如text/plain或text /html,HttpEntity#getContentEncoding()方法用来读取这个信息。如果头部信息不可用,那么就返回长度-1,而对于内容类型返回NULL。如果头部信息Content-Type是可用的,那么就会返回一个Header对象。

当为一个传出报文创建实体时,这个元数据不得不通过实体创建器来提供。StringEntity myEntity = new StringEntity("important message",

"UTF-8");

System.out.println(myEntity.getContentType());

System.out.println(myEntity.getContentLength());

System.out.println(EntityUtils.getContentCharSet(myEntity));

System.out.println(EntityUtils.toString(myEntity));

System.out.println(EntityUtils.toByteArray(myEntity).length);

输出内容为

Content-Type: text/plain; charset=UTF-8

17

UTF-8

important message

17

1.1.5 确保低级别资源释放

当完成一个响应实体,那么保证所有实体内容已经被完全消耗是很重要的,所以连接可以安全的放回到连接池中,而且可以通过连接管理器对后续的请求重用连接。处理这个操作的最方便的方法是调用HttpEntity#consumeContent()方法来消耗流中的任意可用内容。HttpClient探测到内容流尾部已经到达后,会立即会自动释放低层连接,并放回到连接管理器。HttpEntity#consumeContent()方法调用多次也是安全的。

也可能会有特殊情况,当整个响应内容的一小部分需要获取,消耗剩余内容而损失性能,还有重用连接的代价太高,则可以仅仅通过调用HttpUriRequest#abort()方法来中止请求。HttpGet httpget = new HttpGet("http://localhost/");

HttpResponse response = httpclient.execute(httpget);

HttpEntity entity = response.getEntity();

if (entity != null) {

InputStream instream = entity.getContent();

int byteOne = instream.read();

int byteTwo = instream.read();

// Do not need the rest

httpget.abort();

}

连接不会被重用,但是由它持有的所有级别的资源将会被正确释放。

1.1.6 消耗实体内容

推荐消耗实体内容的方式是使用它的HttpEntity#getContent()或

HttpEntity#writeTo(OutputStream)方法。HttpClient也自带EntityUtils类,这会暴露出一些静态方法,这些方法可以更加容易地从实体中读取内容或信息。代替直接读取

java.io.InputStream,也可以使用这个类中的方法以字符串/字节数组的形式获取整个内容体。然而,EntityUtils的使用是强烈不鼓励的,除非响应实体源自可靠的HTTP服务器和已知的长度限制。

HttpGet httpget = new HttpGet("http://localhost/");

HttpResponse response = httpclient.execute(httpget);

HttpEntity entity = response.getEntity();

if (entity != null) {

long len = entity.getContentLength();

if (len != -1 && len < 2048) {

System.out.println(EntityUtils.toString(entity));

} else {

// Stream content out

}

}

在一些情况下可能会不止一次的读取实体。此时实体内容必须以某种方式在内存或磁盘上被缓冲起来。最简单的方法是通过使用BufferedHttpEntity类来包装源实体完成。这会引起源实体内容被读取到内存的缓冲区中。在其它所有方式中,实体包装器将会得到源实体。HttpGet httpget = new HttpGet("http://localhost/");

HttpResponse response = httpclient.execute(httpget);

HttpEntity entity = response.getEntity();

if (entity != null) {

entity = new BufferedHttpEntity(entity);

}

1.1.7 生成实体内容

HttpClient 提供一些类,它们可以用于生成通过HTTP连接获得内容的有效输出流。为了封闭实体从HTTP请求中获得的输出内容,那些类的实例可以和封闭如POST和PUT请求的实体相关联。HttpClient为很多公用的数据容器,比如字符串,字节数组,输入流和文件提供了一些类:StringEntity,ByteArrayEntity,InputStreamEntity和FileEntity。

File file = new File("somefile.txt");

FileEntity entity = new FileEntity(file, "text/plain; charset=\"UTF-8\"");

HttpPost httppost = new HttpPost("http://localhost/action.do");

httppost.setEntity(entity);

请注意InputStreamEntity是不可重复的,因为它仅仅能从低层数据流中读取一次内容。通常来说,我们推荐实现一个定制的HttpEntity 类,这是自我包含式的,用来代替使用通用的InputStreamEntity。FileEntity也是一个很好的起点。

1.1.7.1 动态内容实体

通常来说,HTTP实体需要基于特定的执行上下文来动态地生成。通过使用EntityTemplate

实体类和ContentProducer接口,HttpClient提供了动态实体的支持。内容生成器是按照需求生成它们内容的对象,将它们写入到一个输出流中。它们是每次被请求时来生成内容。所以用EntityTemplate创建的实体通常是自我包含而且可以重复的。

ContentProducer cp = new ContentProducer() {

public void writeTo(OutputStream outstream) throws IOException {

Writer writer = new OutputStreamWriter(outstream, "UTF-8");

writer.write("");

writer.write(" ");

writer.write(" important stuff");

writer.write(" ");

writer.write("");

writer.flush();

}

};

HttpEntity entity = new EntityTemplate(cp);

HttpPost httppost = new HttpPost("http://localhost/handler.do");

httppost.setEntity(entity);

1.1.7.2 HTML表单

许多应用程序需要频繁模拟提交一个HTML表单的过程,比如,为了来记录一个Web应用程序或提交输出数据。HttpClient提供了特殊的实体类UrlEncodedFormEntity来这个满足过程。

List formparams = new ArrayList(); formparams.add(new BasicNameValuePair("param1", "value1"));

formparams.add(new BasicNameValuePair("param2", "value2")); UrlEncodedFormEntity entity = new UrlEncodedFormEntity(formparams, "UTF-8"); HttpPost httppost = new HttpPost("http://localhost/handler.do");

httppost.setEntity(entity);

UrlEncodedFormEntity实例将会使用URL编码来编码参数,生成如下的内容:

param1=value1¶m2=value2

1.1.7.3 内容分块

通常,我们推荐让HttpClient选择基于被传递的HTTP报文属性的最适合的编码转换。这是可能的,但是,设置HttpEntity#setChunked()方法为true是通知HttpClient分块编码的首选。请注意HttpClient将会使用标识作为提示。当使用的HTTP协议版本,如HTTP/1.0版本,不支持分块编码时,这个值会被忽略。

StringEntity entity = new StringEntity("important message",

"text/plain; charset=\"UTF-8\"");

entity.setChunked(true);

HttpPost httppost = new HttpPost("http://localhost/acrtion.do");

httppost.setEntity(entity);

1.1.8 响应控制器

控制响应的最简便和最方便的方式是使用ResponseHandler接口。这个放完完全减轻了用

户关于连接管理的担心。当使用ResponseHandler时,HttpClient将会自动关注并保证释放连接到连接管理器中去,而不管请求执行是否成功或引发了异常。

HttpClient httpclient = new DefaultHttpClient();

HttpGet httpget = new HttpGet("http://localhost/");

ResponseHandler handler = new ResponseHandler() {

public byte[] handleResponse(

HttpResponse response) throws ClientProtocolException, IOException {

HttpEntity entity = response.getEntity();

if (entity != null) {

return EntityUtils.toByteArray(entity);

} else {

return null;

}

}

};

byte[] response = httpclient.execute(httpget, handler);

1.2 HTTP执行的环境

最初,HTTP是被设计成无状态的,面向请求-响应的协议。然而,真实的应用程序经常需要通过一些逻辑相关的请求-响应交换来持久状态信息。为了开启应用程序来维持一个过程状态,HttpClient允许HTTP请求在一个特定的执行环境中来执行,简称为HTTP上下文。如果相同的环境在连续请求之间重用,那么多种逻辑相关的请求可以参与到一个逻辑会话中。HTTP上下文功能和java.util.Map很相似。它仅仅是任意命名参数值的集合。应用程序可以在请求之前或在检查上下文执行完成之后来填充上下文属性。

在HTTP请求执行的这一过程中,HttpClient添加了下列属性到执行上下文中:

'http.connection':HttpConnection实例代表了连接到目标服务器的真实连接。

'http.target_host':HttpHost实例代表了连接目标。

'http.proxy_host':如果使用了,HttpHost实例代表了代理连接。

'http.request':HttpRequest实例代表了真实的HTTP请求。

'http.response':HttpResponse实例代表了真实的HTTP响应。

'http.request_sent':https://www.360docs.net/doc/7e16004385.html,ng.Boolean对象代表了暗示真实请求是否被完全传送到目标连接的标识。

比如,为了决定最终的重定向目标,在请求执行之后,可以检查http.target_host属性的值:DefaultHttpClient httpclient = new DefaultHttpClient();

HttpContext localContext = new BasicHttpContext();

HttpGet httpget = new HttpGet("https://www.360docs.net/doc/7e16004385.html,/");

HttpResponse response = httpclient.execute(httpget, localContext);

HttpHost target = (HttpHost) localContext.getAttribute(

ExecutionContext.HTTP_TARGET_HOST);

System.out.println("Final target: " + target);

HttpEntity entity = response.getEntity();

if (entity != null) {

entity.consumeContent();

}

输出内容为:

Final target: http://www.google.ch

1.3 异常处理

HttpClient 能够抛出两种类型的异常:在I/O失败时,如套接字连接超时或被重置的java.io.IOException异常,还有标志HTTP请求失败的信号,如违反HTTP协议的HttpException异常。通常I/O错误被认为是非致命的和可以恢复的,而HTTP协议错误则被认为是致命的而且是不能自动恢复的。

1.3.1 HTTP运输安全

要理解HTTP协议并不是对所有类型的应用程序都适合的,这一点很重要。HTTP是一个简单的面向请求/响应的协议,最初被设计用来支持取回静态或动态生成的内容。它从未向支持事务性操作方向发展。比如,如果成功收到和处理请求,HTTP服务器将会考虑它的其中一部分是否完成,生成一个响应并发送一个状态码到客户端。如果客户端因为读取超时,请求取消或系统崩溃导致接收响应实体失败时,服务器不会试图回滚事务。如果客户端决定重新这个请求,那么服务器将不可避免地不止一次执行这个相同的事务。在一些情况下,这会导致应用数据损坏或者不一致的应用程序状态。

尽管HTTP从来都没有被设计来支持事务性处理,但它也能被用作于一个传输协议对关键的任务应用提供被满足的确定状态。要保证HTTP传输层的安全,系统必须保证HTTP方法在应用层的幂等性。

1.3.2 幂等的方法

HTTP/1.1 明确地定义了幂等的方法,描述如下

[方法也可以有“幂等”属性在那些(除了错误或过期问题)N的副作用>0的相同请求和独立的请求是相同的]

换句话说,应用程序应该保证准备着来处理多个相同方法执行的实现。这是可以达到的,比如,通过提供一个独立的事务ID和其它避免执行相同逻辑操作的方法。

请注意这个问题对于HttpClient是不具体的。基于应用的浏览器特别受和非幂等的HTTP方法相关的相同问题的限制。

HttpClient假设没有实体包含方法,比如GET和HEAD是幂等的,而实体包含方法,比如POST和PUT则不是。

1.3.3 异常自动恢复

默认情况下,HttpClient会试图自动从I/O异常中恢复。默认的自动恢复机制是受很少一部分已知的异常是安全的这个限制。

HttpClient不会从任意逻辑或HTTP协议错误(那些是从HttpException类中派生出的)中恢复的。

HttpClient将会自动重新执行那么假设是幂等的方法。

HttpClient将会自动重新执行那些由于运输异常失败,而HTTP请求仍然被传送到目标服务器(也就是请求没有完全被送到服务器)失败的方法。

HttpClient 将会自动重新执行那些已经完全被送到服务器,但是服务器使用HTTP状态码(服务器仅仅丢掉连接而不会发回任何东西)响应时失败的方法。在这种情况下,假设请求没有被服务器处理,而应用程序的状态也没有改变。如果这个假设可能对于你应用程序的目标Web服务器来说不正确,那么就强烈建议提供一个自定义的异常处理器。

1.3.4 请求重试处理

为了开启自定义异常恢复机制,应该提供一个HttpRequestRetryHandler接口的实现。DefaultHttpClient httpclient = new DefaultHttpClient();

HttpRequestRetryHandler myRetryHandler = new HttpRequestRetryHandler() {

public boolean retryRequest(IOException exception,

int executionCount,HttpContext context) {

if (executionCount >= 5) {

// 如果超过最大重试次数,那么就不要继续了

return false;

}

if (exception instanceof NoHttpResponseException) {

// 如果服务器丢掉了连接,那么就重试

return true;

}

if (exception instanceof SSLHandshakeException) {

// 不要重试SSL握手异常

return false;

}

HttpRequest request = (HttpRequest) context.getAttribute(

ExecutionContext.HTTP_REQUEST);

boolean idempotent = !(request instanceof HttpEntityEnclosingRequest);

if (idempotent) {

// 如果请求被认为是幂等的,那么就重试

return true;

}

return false;

}

};

httpclient.setHttpRequestRetryHandler(myRetryHandler);

1.4 中止请求

在一些情况下,由于目标服务器的高负载或客户端有很多活动的请求,那么HTTP请求执行会在预期的时间框内而失败。这时,就可能不得不过早地中止请求,解除封锁在I/O执行中的线程封锁。被HttpClient执行的HTTP请求可以在执行的任意阶段通过调用HttpUriRequest#abort()方法而中止。这个方法是线程安全的,而且可以从任意线程中调用。当一个HTTP请求被中止时,它的执行线程就封锁在I/O操作中了,而且保证通过抛出InterruptedIOException异常来解锁。

1.5 HTTP协议拦截器

HTTP 协议拦截器是一个实现了特定HTPP协议方面的惯例。通常协议拦截器希望作用于一个特定头部信息上,或者一族收到报文的相关头部信息,或使用一个特定的头部或一族相关的头部信息填充发出的报文。协议拦截器也可以操纵包含在报文中的内容实体,透明的内容压缩/解压就是一个很好的示例。通常情况下这是由包装器实体类使用了“装饰者”模式来

装饰原始的实体完成的。一些协议拦截器可以从一个逻辑单元中来结合。

协议拦截器也可以通过共享信息来共同合作-比如处理状态-通过HTTP执行上下文。协议拦截器可以使用HTTP内容来为一个或多个连续的请求存储一个处理状态。

通常拦截器执行的顺序不应该和它们基于的特定执行上下文状态有关。如果协议拦截器有相互依存关系,那么它们必须按特定顺序来执行,正如它们希望执行的顺序一样,它们应该在相同的序列中被加到协议处理器。

协议拦截器必须实现为线程安全的。和Servlet相似,协议拦截器不应该使用实例变量,除非访问的那些变量是同步的。

这个示例给出了本地内容在连续的请求中怎么被用于持久一个处理状态的:DefaultHttpClient httpclient = new DefaultHttpClient();

HttpContext localContext = new BasicHttpContext();

AtomicInteger count = new AtomicInteger(1);

localContext.setAttribute("count", count);

httpclient.addRequestInterceptor(new HttpRequestInterceptor() {

public void process(final HttpRequest request,

final HttpContext context) throws HttpException, IOException {

AtomicInteger count = (AtomicInteger) context.getAttribute("count");

request.addHeader("Count", Integer.toString(count.getAndIncrement()));

}

});

HttpGet httpget = new HttpGet("http://localhost/");

for (int i = 0; i < 10; i++) {

HttpResponse response = httpclient.execute(httpget, localContext);

HttpEntity entity = response.getEntity();

if (entity != null) {

entity.consumeContent();

}

}

1.6 HTTP参数

HttpParams 接口代表了定义组件运行时行为的一个不变的值的集合。很多情况下,HttpParams和HttpContext相似。二者之间的主要区别是它们在运行时使用的不同。这两个接口表示了对象的集合,它们被视作为访问对象值的键的Map,但是服务于不同的目的:HttpParams旨在包含简单对象:整型,浮点型,字符串,集合,还有运行时不变的对象。HttpParams希望被用在“一次写入-多处准备”模式下。HttpContext旨在包含很可能在HTTP 报文处理这一过程中发生改变的复杂对象

HttpParams的目标是定义其它组件的行为。通常每一个复杂的组件都有它自己的HttpParams对象。HttpContext的目标是来表示一个HTTP处理的执行状态。通常相同的执行上下文在很多合作的对象中共享。

1.6.1 参数层次

在HTTP请求执行过程中,HttpRequest对象的HttpParams是和用于执行请求的HttpClient 实例的HttpParams联系在一起的。这使得设置在HTTP请求级别的参数优先于设置在HTTP客户端级别的HttpParams。推荐的做法是设置普通参数对所有的在HTTP客户端级别

的HTTP请求共享,而且可以选择性重写具体在HTTP请求级别的参数。DefaultHttpClient httpclient = new DefaultHttpClient();

httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION,HttpVer sion.HTTP_1_0);

httpclient.getParams().setParameter(CoreProtocolPNames.HTTP_CONTENT_CHARSET,"U TF-8");

HttpGet httpget = new HttpGet("https://www.360docs.net/doc/7e16004385.html,/");

httpget.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION,HttpVersio n.HTTP_1_1);

httpget.getParams().setParameter(https://www.360docs.net/doc/7e16004385.html,E_EXPECT_CONTINUE,Boolea n.FALSE);

httpclient.addRequestInterceptor(new HttpRequestInterceptor() {

public void process(final HttpRequest request,

final HttpContext context) throws HttpException, IOException {

System.out.println(request.getParams().getParameter(

CoreProtocolPNames.PROTOCOL_VERSION));

System.out.println(request.getParams().getParameter(

CoreProtocolPNames.HTTP_CONTENT_CHARSET));

System.out.println(request.getParams().getParameter(

https://www.360docs.net/doc/7e16004385.html,E_EXPECT_CONTINUE));

System.out.println(request.getParams().getParameter(

CoreProtocolPNames.STRICT_TRANSFER_ENCODING));

}

});

输出内容为:

HTTP/1.1

UTF-8

false

null

1.6.2 HTTP参数bean

HttpParams 接口允许在处理组件的配置上很大的灵活性。很重要的是,新的参数可以被引入而不会影响老版本的二进制兼容性。然而,和常规的Java bean相比,HttpParams也有一个缺点:HttpParams不能使用DI框架来组合。为了缓解这个限制,HttpClient包含了一些bean类,它们可以用来按顺序使用标准的Java eban惯例初始化HttpParams对象。HttpParams params = new BasicHttpParams();

HttpProtocolParamBean paramsBean = new HttpProtocolParamBean(params); paramsBean.setVersion(HttpVersion.HTTP_1_1);

paramsBean.setContentCharset("UTF-8");

paramsBean.setUseExpectContinue(true);

System.out.println(params.getParameter(

CoreProtocolPNames.PROTOCOL_VERSION));

System.out.println(params.getParameter(

CoreProtocolPNames.HTTP_CONTENT_CHARSET));

System.out.println(params.getParameter(

https://www.360docs.net/doc/7e16004385.html,E_EXPECT_CONTINUE));

System.out.println(params.getParameter(

https://www.360docs.net/doc/7e16004385.html,ER_AGENT));

输出内容为:

HTTP/1.1

UTF-8

false

null

1.7 HTTP请求执行参数

这些参数会影响到请求执行的过程:

'http.protocol.version':如果没有在请求对象中设置明确的版本信息,它就定义了使用的HTTP协议版本。这个参数期望得到一个ProtocolVersion类型的值。如果这个参数没有被设置,那么就使用HTTP/1.1。

'http.protocol.element-charset':定义了编码HTTP协议元素的字符集。这个参数期望得到一个https://www.360docs.net/doc/7e16004385.html,ng.String类型的值。如果这个参数没有被设置,那么就使用US-ASCII。

'http.protocol.eontent-charset':定义了为每个内容主体编码的默认字符集。这个参数期望得到一个https://www.360docs.net/doc/7e16004385.html,ng.String类型的值。如果这个参数没有被设置,那么就使用ISO-8859-1。'https://www.360docs.net/doc/7e16004385.html,eragent':定义了头部信息User-Agent的内容。这个参数期望得到一个

https://www.360docs.net/doc/7e16004385.html,ng.String类型的值。如果这个参数没有被设置,那么HttpClient将会为它自动生成一个值。

'http.protocol.strict-transfer-encoding':定义了响应头部信息中是否含有一个非法的Transfer-Encoding,都要拒绝掉。

'http.protocol.expect- continue':为包含方法的实体激活Expect: 100-Continue握手。Expect: 100-Continue握手的目的是允许客户端使用请求体发送一个请求信息来决定源服务器是否

希望在客户端发送请求体之前得到这个请求(基于请求头部信息)。Expect: 100-Continue 握手的使用可以对需要目标服务器认证的包含请求的实体(比如POST和PUT)导致明显的性能改善。Expect: 100-Continue握手应该谨慎使用,因为它和HTTP服务器,不支持HTTP/1.1协议的代理使用会引起问题。这个参数期望得到一个https://www.360docs.net/doc/7e16004385.html,ng.Boolean类型的值。如果这个参数没有被设置,那么HttpClient将会试图使用握手。

'http.protocol.wait- for-continue':定义了客户端应该等待100-Continue响应最大的毫秒级时间间隔。这个参数期望得到一个https://www.360docs.net/doc/7e16004385.html,ng.Integer类型的值。如果这个参数没有被设置,那么HttpClient将会在恢复请求体传输之前为确认等待3秒。

第二章连接管理

HttpClient有一个对连接初始化和终止,还有在活动连接上I/O操作的完整控制。而连接操作的很多方面可以使用一些参数来控制。

2.1 连接参数

这些参数可以影响连接操作:

'http.socket.timeout':定义了套接字的毫秒级超时时间(SO_TIMEOUT),这就是等待数据,换句话说,在两个连续的数据包之间最大的闲置时间。如果超时时间是0就解释为是一个无限大的超时时间。这个参数期望得到一个https://www.360docs.net/doc/7e16004385.html,ng.Integer类型的值。如果这个参数没有被设置,那么读取操作就不会超时(无限大的超时时间)。

'http.tcp.nodelay':决定了是否使用Nagle算法。Nagle算法视图通过最小化发送的分组数量来节省带宽。当应用程序希望降低网络延迟并提高性能时,它们可以关闭Nagle算法(也就是开启TCP_NODELAY)。数据将会更早发送,增加了带宽消耗的成文。这个参数期望得到一个https://www.360docs.net/doc/7e16004385.html,ng.Boolean类型的值。如果这个参数没有被设置,那么TCP_NODELAY就会开启(无延迟)。

'http.socket.buffer- size':决定了内部套接字缓冲使用的大小,来缓冲数据同时接收/传输HTTP报文。这个参数期望得到一个https://www.360docs.net/doc/7e16004385.html,ng.Integer类型的值。如果这个参数没有被设置,那么HttpClient将会分配8192字节的套接字缓存。

'http.socket.linger':使用指定的秒数拖延时间来设置SO_LINGER。最大的连接超时值是平台指定的。值0暗示了这个选项是关闭的。值-1暗示了使用了JRE默认的。这个设置仅仅影响套接字关闭操作。如果这个参数没有被设置,那么就假设值为-1(JRE默认)。

'http.connection.timeout':决定了直到连接建立时的毫秒级超时时间。超时时间的值为0解释为一个无限大的时间。这个参数期望得到一个https://www.360docs.net/doc/7e16004385.html,ng.Integer类型的值。如果这个参数没有被设置,连接操作将不会超时(无限大的超时时间)。

'http.connection.stalecheck':决定了是否使用旧的连接检查。当在一个连接之上执行一个请求而服务器端的连接已经关闭时,关闭旧的连接检查可能导致在获得一个I/O错误风险时显著的性能提升(对于每一个请求,检查时间可以达到30毫秒)。这个参数期望得到一个https://www.360docs.net/doc/7e16004385.html,ng.Boolean类型的值。出于性能的关键操作,检查应该被关闭。如果这个参数没有被设置,那么旧的连接将会在每个请求执行之前执行。

'http.connection.max- line-length':决定了最大请求行长度的限制。如果设置为一个正数,任何HTTP请求行超过这个限制将会引发java.io.IOException异常。负数或零将会关闭这个检查。这个参数期望得到一个https://www.360docs.net/doc/7e16004385.html,ng.Integer类型的值。如果这个参数没有被设置,那么就不强制进行限制了。

'http.connection.max- header-count':决定了允许的最大HTTP头部信息数量。如果设置为一个正数,从数据流中获得的HTTP头部信息数量超过这个限制就会引发

java.io.IOException异常。负数或零将会关闭这个检查。这个参数期望得到一个

https://www.360docs.net/doc/7e16004385.html,ng.Integer类型的值。如果这个参数没有被设置,那么就不

强制进行限制了。

'http.connection.max- status-line-garbage':决定了在期望得到HTTP响应状态行之前可忽略请求行的最大数量。使用HTTP/1.1持久性连接,这个问题产生的破碎的脚本将会返回一个错误的Content-Length(有比指定的字节更多的发送)。不幸的是,在某些情况下,这个不能在错误响应后来侦测,只能在下一次之前。所以HttpClient必须以这种方式跳过那些多余的行。这个参数期望得到一个https://www.360docs.net/doc/7e16004385.html,ng.Integer类型的值。0是不允许在状态行之前的所有垃圾/空行。使用https://www.360docs.net/doc/7e16004385.html,ng.Integer#MAX_VALUE来设置不限制的数字。如果这个参数没有被设置那就假设是不限制的。

2.2 持久连接

从一个主机向另外一个建立连接的过程是相当复杂的,而且包含了两个终端之间的很多包的交换,它是相当费时的。连接握手的开销是很重要的,特别是对小量的HTTP报文。如果打开的连接可以被重用来执行多次请求,那么就可以达到很高的数据吞吐量。

HTTP/1.1 强调HTTP连接默认情况可以被重用于多次请求。HTTP/1.0兼容的终端也可以使用相似的机制来明确地交流它们的偏好来保证连接处于活动状态,也使用它来处理多个请求。HTTP代理也可以保持空闲连接处于一段时间的活动状态,防止对相同目标主机的一个连接也许对随后的请求需要。保持连接活动的能力通常被称作持久性连接。HttpClient完

全支持持久性连接。

2.3 HTTP连接路由

HttpClient能够直接或通过路由建立连接到目标主机,这会涉及多个中间连接,也被称为跳。HttpClient区分路由和普通连接,通道和分层。通道连接到目标主机的多个中间代理的使用也称作是代理链。

普通路由由连接到目标或仅第一次的代理来创建。通道路由通过代理链到目标连接到第一通道来建立。没有代理的路由不是通道的,分层路由通过已存在连接的分层协议来建立。协议仅仅可以在到目标的通道上或在没有代理的直接连接上分层。

2.3.1 路由计算

RouteInfo 接口代表关于最终涉及一个或多个中间步骤或跳的目标主机路由的信息。HttpRoute是RouteInfo的具体实现,这是不能改变的(是不变的)。HttpTracker是可变的RouteInfo实现,由HttpClient在内部使用来跟踪到最大路由目标的剩余跳数。HttpTracker 可以在成功执行向路由目标的下一跳之后更新。HttpRouteDirector是一个帮助类,可以用来计算路由中的下一跳。这个类由HttpClient在内部使用。

HttpRoutePlanner 是一个代表计算到基于执行上下文到给定目标完整路由策略的接口。HttpClient附带两个默认的HttpRoutePlanner实现。ProxySelectorRoutePlanner是基于https://www.360docs.net/doc/7e16004385.html,.ProxySelector的。默认情况下,它会从系统属性中或从运行应用程序的浏览器中选取JVM的代理设置。DefaultHttpRoutePlanner实现既不使用任何Java系统属性,也不使用系统或浏览器的代理设置。它只基于HTTP如下面描述的参数计算路由。

2.3.2 安全HTTP连接

如果信息在两个不能由非认证的第三方进行读取或修改的终端之间传输,HTTP连接可以被认为是安全的。SSL/TLS协议是用来保证HTTP传输安全使用最广泛的技术。而其它加密技术也可以被使用。通常来说,HTTP传输是在SSL/TLS加密连接之上分层的。

2.4 HTTP路由参数

这些参数可以影响路由计算:

'http.route.default-proxy':定义可以被不使用JRE设置的默认路由规划者使用的代理主机。这个参数期望得到一个HttpHost类型的值。如果这个参数没有被设置,那么就会尝试直接连接到目标。

'http.route.local- address':定义一个本地地址由所有默认路由规划者来使用。有多个网络接口的机器中,这个参数可以被用于从连接源中选择网络接口。这个参数期望得到一个https://www.360docs.net/doc/7e16004385.html,.InetAddress类型的值。如果这个参数没有被设置,将会自动使用本地地址。

'http.route.forced- route':定义一个由所有默认路由规划者使用的强制路由。代替了计算路由,给定的强制路由将会被返回,尽管它指向一个完全不同的目标主机。这个参数期望得到一个HttpRoute类型的值。如果这个参数没有被设置,那么就使用默认的规则建立连接到目标服务器。

2.5 套接字工厂

LayeredSocketFactory 是SocketFactory接口的扩展。分层的套接字工厂可HTTP连接内部使用https://www.360docs.net/doc/7e16004385.html,.Socket对象来处理数据在线路上的传输。它们依赖SocketFactory接口来创建,初始化和连接套接字。这会使得HttpClient的用户可以提供在运行时指定套接字初始化

代码的应用程序。PlainSocketFactory是创建和初始化普通的(不加密的)套接字的默认工厂。

创建套接字的过程和连接到主机的过程是不成对的,所以套接字在连接操作封锁时可以被关闭。

PlainSocketFactory sf = PlainSocketFactory.getSocketFactory();

Socket socket = sf.createSocket();

HttpParams params = new BasicHttpParams();

params.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 1000L);

sf.connectSocket(socket, "locahost", 8080, null, -1, params);

2.5.1 安全套接字分层

LayeredSocketFactory 是SocketFactory接口的扩展。分层的套接字工厂可以创建在已经存在的普通套接字之上的分层套接字。套接字分层主要通过代理来创建安全的套接字。HttpClient附带实现了SSL/TLS分层的SSLSocketFactory。请注意HttpClient不使用任何自定义加密功能。它完全依赖于标准的Java密码学(JCE)和安全套接字(JSEE)扩展。

2.5.2 SSL/TLS的定制

HttpClient使用SSLSocketFactory来创建SSL连接。SSLSocketFactory允许高度定制。它可以使用https://www.360docs.net/doc/7e16004385.html,.ssl.SSLContext的实例作为参数,并使用它来创建定制SSL连接。TrustManager easyTrustManager = new X509TrustManager() {

@Override

public void checkClientTrusted(X509Certificate[] chain,

String authType) throws CertificateException {

// 哦,这很简单!

}

@Override

public void checkServerTrusted(X509Certificate[] chain,

String authType) throws CertificateException {

//哦,这很简单!

}

@Override

public X509Certificate[] getAcceptedIssuers() {

return null;

}

};

SSLContext sslcontext = SSLContext.getInstance("TLS");

sslcontext.init(null, new TrustManager[] { easyTrustManager }, null); SSLSocketFactory sf = new SSLSocketFactory(sslcontext);

SSLSocket socket = (SSLSocket) sf.createSocket();

socket.setEnabledCipherSuites(new String[] { "SSL_RSA_WITH_RC4_128_MD5" }); HttpParams params = new BasicHttpParams();

params.setParameter(CoreConnectionPNames.CONNECTION_TIMEOUT, 1000L);

sf.connectSocket(socket, "locahost", 443, null, -1, params);

SSLSocketFactory的定制暗示出一定程度SSL/TLS协议概念的熟悉,这个详细的解释超出

了本文档的范围。请参考Java的安全套接字扩展

[https://www.360docs.net/doc/7e16004385.html,/j2se/1.5.0/docs/guide/

security/jsse/JSSERefGuide.html],这是https://www.360docs.net/doc/7e16004385.html,.ssl.SSLContext和相关工具的详细描述。

2.5.3 主机名验证

除了信任验证和客户端认证在SSL/TLS协议级上进行,一旦连接建立之后,HttpClient能

可选地验证目标主机名匹配存储在服务器的X.509认证中的名字。这个认证可以提供额外的服务器信任材料的真实保证。X509主机名验证接口代表了主机名验证的策略。HttpClient 附带了3个X509主机名验证器。很重要的一点是:主机名验证不应该混淆SSL信任验证。StrictHostnameVerifier:严格的主机名验证在Sun Java 1.4,Sun Java 5和Sun Java 6中是相同的。而且也非常接近IE6。这个实现似乎是兼容RFC 2818处理通配符的。主机名必须匹配第一个CN或任意的subject-alt。在CN和其它任意的subject-alt中可能会出现通配符。

BrowserCompatHostnameVerifier:主机名验证器和Curl和Firefox的工作方式是相同的。主机名必须匹配第一个CN或任意的subject-alt。在CN和其它任意的subject-alt中可能会出现通配符。BrowserCompatHostnameVerifier和StrictHostnameVerifier的唯一不同是使用BrowserCompatHostnameVerifier匹配所有子域的通配符(比如”*https://www.360docs.net/doc/7e16004385.html,”),包

括”https://www.360docs.net/doc/7e16004385.html,”。

AllowAllHostnameVerifier:这个主机名验证器基本上是关闭主机名验证的。这个实现是一个空操作,而且不会抛出https://www.360docs.net/doc/7e16004385.html,.ssl.SSLException异常。

每一个默认的HttpClient使用BrowserCompatHostnameVerifier的实现。如果需要的话,它可以指定不同的主机名验证器实现。

SSLSocketFactory sf = new SSLSocketFactory(SSLContext.getInstance("TLS"));

sf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);

2.6 协议模式

Scheme 类代表了一个协议模式,比如“http”或“https”同时包含一些协议属性,比如默认端口,用来为给定协议创建https://www.360docs.net/doc/7e16004385.html,.Socket实例的套接字工厂。SchemeRegistry类用来维

持一组Scheme,当去通过请求URI建立连接时,HttpClient可以从中选择:

Scheme http = new Scheme("http", PlainSocketFactory.getSocketFactory(), 80); SSLSocketFactory sf = new SSLSocketFactory(SSLContext.getInstance("TLS"));

sf.setHostnameVerifier(SSLSocketFactory.STRICT_HOSTNAME_VERIFIER);

Scheme https = new Scheme("https", sf, 443);

SchemeRegistry sr = new SchemeRegistry();

sr.register(http);

sr.register(https);

2.7 HttpClient代理配置

尽管HttpClient了解复杂的路由模式和代理链,它仅支持简单直接的或开箱的跳式代理连接。告诉HttpClient通过代理去连接到目标主机的最简单方式是通过设置默认的代理参数:DefaultHttpClient httpclient = new DefaultHttpClient();

HttpHost proxy = new HttpHost("someproxy", 8080);

httpclient.getParams().setParameter(ConnRoutePNames.DEFAULT_PROXY, proxy);

也可以构建HttpClient使用标准的JRE代理选择器来获得代理信息:

DefaultHttpClient httpclient = new DefaultHttpClient(); ProxySelectorRoutePlanner routePlanner = new ProxySelectorRoutePlanner( httpclient.getConnectionManager().getSchemeRegistry(),

ProxySelector.getDefault());

httpclient.setRoutePlanner(routePlanner);

另外一种选择,可以提供一个定制的RoutePlanner实现来获得HTTP路由计算处理上的复

杂的控制:

DefaultHttpClient httpclient = new DefaultHttpClient();

httpclient.setRoutePlanner(new HttpRoutePlanner() {

public HttpRoute determineRoute(HttpHost target,

HttpRequest request,

HttpContext context) throws HttpException {

return new HttpRoute(target, null, new HttpHost("someproxy", 8080),

"https".equalsIgnoreCase(target.getSchemeName()));

}

});

2.8 HTTP连接管理器

2.8.1 连接操作器

连接操作是客户端的低层套接字或可以通过外部实体,通常称为连接操作的被操作的状态的连接。OperatedClientConnection接口扩展了HttpClientConnection接口而且定义了额外的控制连接套接字的方法。ClientConnectionOperator接口代表了创建实例和更新那些对象低层套接字的策略。实现类最有可能利用SocketFactory来创建https://www.360docs.net/doc/7e16004385.html,.Socket实例。ClientConnectionOperator接口可以让HttpClient的用户提供一个连接操作的定制策略和提供可选实现OperatedClientConnection接口的能力。

2.8.2 管理连接和连接管理器

HTTP 连接是复杂的,有状态的,线程不安全的对象需要正确的管理以便正确地执行功能。HTTP连接在同一时间仅仅只能由一个执行线程来使用。HttpClient采用一个特殊实体来管理访问HTTP连接,这被称为HTTP连接管理器,代表了ClientConnectionManager接口。一个HTTP连接管理器的目的是作为工厂服务于新的HTTP连接,管理持久连接和同步访问持久连接来确保同一时间仅有一个线程可以访问一个连接。

内部的HTTP连接管理器和OperatedClientConnection实例一起工作,但是它们为服务消

耗器ManagedClientConnection提供实例。ManagedClientConnection扮演连接之上管理状态控制所有I/O操作的OperatedClientConnection实例的包装器。它也抽象套接字操作,

提供打开和更新去创建路由套接字便利的方法。ManagedClientConnection实例了解产生

它们到连接管理器的链接,而且基于这个事实,当不再被使用时,它们必须返回到管理器。ManagedClientConnection类也实现了ConnectionReleaseTrigger接口,可以被用来触发释放连接返回给管理器。一旦释放连接操作被触发了,被包装的连接从ManagedClientConnection包装器中脱离,OperatedClientConnection实例被返回给管理器。尽管服务消耗器仍然持有ManagedClientConnection实例的引用,它也不再去执行任何I/O 操作或有意无意地改变的OperatedClientConnection状态。

这里有一个从连接管理器中获取连接的示例:

HttpParams params = new BasicHttpParams();

Scheme http = new Scheme("http", PlainSocketFactory.getSocketFactory(), 80); SchemeRegistry sr = new SchemeRegistry();

sr.register(http);

ClientConnectionManager connMrg = new SingleClientConnManager(params, sr);

// 请求新连接。这可能是一个很长的过程。

ClientConnectionRequest connRequest = connMrg.requestConnection(

new HttpRoute(new HttpHost("localhost", 80)), null);

// 等待连接10秒

ManagedClientConnection conn = connRequest.getConnection(10, TimeUnit.SECONDS); try {

// 用连接在做有用的事情。当完成时释放连接。

conn.releaseConnection();

} catch (IOException ex) {

// 在I/O error之上终止连接。

conn.abortConnection();

throw ex;

}

如果需要,连接请求可以通过调用来ClientConnectionRequest#abortRequest()方法过早地中断。这会解锁在ClientConnectionRequest#getConnection()方法中被阻止的线程。

一旦响应内容被完全消耗后,BasicManagedEntity包装器类可以用来保证自动释放低层的连接。HttpClient内部使用这个机制来实现透明地对所有从HttpClient#execute()方法中获得响应释放连接:

ClientConnectionRequest connRequest = connMrg.requestConnection(

new HttpRoute(new HttpHost("localhost", 80)), null); ManagedClientConnection conn = connRequest.getConnection(10, TimeUnit.SECONDS); try {

BasicHttpRequest request = new BasicHttpRequest("GET", "/");

conn.sendRequestHeader(request);

HttpResponse response = conn.receiveResponseHeader();

conn.receiveResponseEntity(response);

HttpEntity entity = response.getEntity();

if (entity != null) {

BasicManagedEntity managedEntity = new BasicManagedEntity(entity, conn, true);

// 替换实体

response.setEntity(managedEntity);

}

// 使用响应对象做有用的事情。当响应内容被消耗后这个连接将会自动释放。

} catch (IOException ex) {

//在I/O error之上终止连接。

conn.abortConnection();

throw ex;

}

2.8.3 简单连接管理器

SingleClientConnManager 是一个简单的连接管理器,在同一时间它仅仅维护一个连接。尽管这个类是线程安全的,但它应该被用于一个执行线程。SingleClientConnManager对于同一路由的后续请求会尽量重用连接。而如果持久连接的路由不匹配连接请求的话,它也会关闭存在的连接之后对给定路由再打开一个新的。如果连接已经被分配,将会抛出

https://www.360docs.net/doc/7e16004385.html,ng.IllegalStateException异常。

对于每个默认连接,HttpClient使用SingleClientConnManager。

2.8.4 连接池管理器

ThreadSafeClientConnManager 是一个复杂的实现来管理客户端连接池,它也可以从多个执行线程中服务连接请求。对每个基本的路由,连接都是池管理的。对于路由的请求,管理器在池中有可用的持久性连接,将被从池中租赁连接服务,而不是创建一个新的连接。ThreadSafeClientConnManager 维护每个基本路由的最大连接限制。每个默认的实现对每个给定路由将会创建不超过两个的并发连接,而总共也不会超过20个连接。对于很多真实的应用程序,这个限制也证明很大的制约,特别是他们在服务中使用HTTP作为传输协议。连接限制,也可以使用HTTP参数来进行调整。

这个示例展示了连接池参数是如何来调整的:

HttpParams params = new BasicHttpParams();

// 增加最大连接到200

ConnManagerParams.setMaxTotalConnections(params, 200);

// 增加每个路由的默认最大连接到20

ConnPerRouteBean connPerRoute = new ConnPerRouteBean(20);

// 对localhost:80增加最大连接到50

HttpHost localhost = new HttpHost("locahost", 80);

connPerRoute.setMaxForRoute(new HttpRoute(localhost), 50); ConnManagerParams.setMaxConnectionsPerRoute(params, connPerRoute); SchemeRegistry schemeRegistry = new SchemeRegistry();

schemeRegistry.register(

new Scheme("http", PlainSocketFactory.getSocketFactory(), 80)); schemeRegistry.register(

new Scheme("https", SSLSocketFactory.getSocketFactory(), 443)); ClientConnectionManager cm = new ThreadSafeClientConnManager(params, schemeRegistry);

HttpClient httpClient = new DefaultHttpClient(cm, params);

2.8.5 连接管理器关闭

当一个HttpClient实例不再需要时,而且即将走出使用范围,那么关闭连接管理器来保证由管理器保持活动的所有连接被关闭,由连接分配的系统资源被释放是很重要的。DefaultHttpClient httpclient = new DefaultHttpClient();

HttpGet httpget = new HttpGet("https://www.360docs.net/doc/7e16004385.html,/");

HttpResponse response = httpclient.execute(httpget);

HttpEntity entity = response.getEntity();

System.out.println(response.getStatusLine());

if (entity != null) {

Process Monitor 中文帮助文档

Process Monitor 帮助文档 【介绍】 Process Monitor(进程监视器)是一个Windows下的高级监视工具,可以实时显示文件系统、注册表和进程/线程的活动。它将Sysinternals以前的两个实用程序Filemon(文件监视器)和Regmon(注册表监视器)结合在一起,并且添加了大量的改进功能,包括丰富的非破坏性的过滤器,全面的事件属性——如会话ID和用户名,可靠的进程信息,对每个操作带有集成的调试符号支持的完整线程堆栈,同步记录日志文件等等。Process Monitor独特的强大功能将使它成为你在系统故障排除和恶意软件查杀中使用的核心实用程序。 Process Monitor可以在Windows 2000 SP4 with Update Rollup 1、Windows XP SP2、Windows Server 2003 SP1、Windows Vista,以及64位版本的Windows XP、Windows Server 2003 SP1和Windows Vista等系统上运行。(译者注:Process Monitor不支持Windows 98、Windows NT等以前的系统,不过可以使用Filemon和Regmon来实现它的部分功能。) 【在Filemon和Regmon基础上的改进】 Process Monitor的用户界面和选项与Filemon和Regmon很相似,但它是从头全部重写的,并且包括许多重大改进,例如: (此处引用自wbpluto的汉化版说明) ? 监视进程和线程的启动和退出,包括退出状态代码 ? 监视映像(DLL 和内核模式驱动程序) 加载 ? 捕获更多输入输出参数操作 ? 非破坏性的过滤器允许你自行定义而不会丢失任何捕获的数据 ? 捕获每一个线程操作的堆栈,使得可以在许多情况下识别一个操作的根源 ? 可靠捕获进程详细信息,包括映像路径、命令行、完整性、用户和会话ID等等 ? 完全可以自定义任何事件的属性列 ? 过滤器可以设置为任何数据条件,包括未在当前视图中显示的 ? 高级的日志机制,可记录上千万的事件,数GB的日志数据 ? 进程树工具显示所有进程的关系

java中文帮助文档

所有类 chm格式可加Q 1281110301索要AbstractAction AbstractBorder AbstractButton AbstractCellEditor AbstractCollection AbstractColorChooserPanel AbstractDocument AbstractDocument.AttributeContext AbstractDocument.Content AbstractDocument.ElementEdit AbstractExecutorService AbstractInterruptibleChannel AbstractLayoutCache AbstractLayoutCache.NodeDimensions AbstractList AbstractListModel AbstractMap AbstractMethodError AbstractPreferences AbstractQueue AbstractQueuedSynchronizer AbstractSelectableChannel AbstractSelectionKey AbstractSelector AbstractSequentialList AbstractSet AbstractSpinnerModel AbstractTableModel AbstractUndoableEdit AbstractWriter AccessControlContext AccessControlException AccessController AccessException Accessible AccessibleAction AccessibleAttributeSequence AccessibleBundle AccessibleComponent AccessibleContext AccessibleEditableText AccessibleExtendedComponent

spring-3.1.0中文版api帮助文档

Spring 3.x权威开发指南:实施Java EE 6 的利器 2011年8月31日

目录 序 ............................................................................................................................................VIII 前言 ........................................................................................................................................... X 1借助Spring 3.1实施Java EE 6 . (1) 1.1Java EE 6编程模型讨论 (1) 1.1.1Java EE 6够敏捷,No! (1) 1.1.2盘旋于具体与抽象之间 (2) 1.2挖掘Spring 3.1的架构价值 (3) 1.2.1精耕细作于Java EE 6平台 (3) 1.2.2面向Spring的SpringSource Tool Suite集成开发工具 (3) 1.2.3全面拥抱OSGi 4.2 (4) 1.2.4开发者决定一切 (4) 1.3下载及构建Spring 3.1 (5) 1.3.1下载Spring 3.1正式发布版 (5) 1.3.2基于SVN库持续构建Spring源码 (6) 1.4小结 (7) 2控制反转容器 (8) 2.1DI及Spring DI概述 (8) 2.1.1面向Java ME/Java SE的BeanFactory (8) 2.1.2面向Java EE的ApplicationContext (9) 2.2多种依赖注入方式 (9) 2.2.1设值注入 (9) 2.2.2构建器注入 (11) 2.2.3属性注入 (12) 2.2.4方法注入 (12) 2.3借助Autowiring策略智能注入协作者 (13)

总结的Javadoc转换chm帮助文档的四种方法

https://www.360docs.net/doc/7e16004385.html,/blog/1051688 李顺利 [2010年1月6日] 关键词 Javadoc chm 转换 jd2chm javadoc2chm javadoc2help Javadoc2chm 中文乱码李顺利 前言 朋友,当您在一个项目完成后,是不是需要把你的源码打包并且把注释打成Javadoc交给客户,Eclipse或者MyEclipse自动打成的Javadoc文档都是基于网页格式的,打开是很方便,不过真的用的时候,搜索每个方法或者什么的就很麻烦了,而chm帮助文档格式不但文件小,查阅都很方便,所以网上就出现了很多把Javadoc转换为chm格式的帮助文档的软件/工具或者方法。 自己最近需要真的需要这个方面的需求,查阅了网上很多方法,发现很多都是写的很不详细,对于我这种刚接触的很是不清楚,经过我的学习和理解,现提供从网上总结的Javadoc转换chm帮助文档的四种方法,详细提供各个转换的步骤供大家学习,并且提供英文版本和中文版本Javadoc转换过程中出现的问题,特别是中文的时候出现的乱码现象,也提供一些解决方案。 预处理 转换之前需要了解的是chm是微软公司发布的一种帮助文档格式,所有,要使用下面的方法转换,请先安装HTML Help Workshop(后面简称为HHW)(实际上后面的一些处理有些都是在上面操作的) https://www.360docs.net/doc/7e16004385.html,/en-us/library/ms669985.aspx,下载完毕后就是安装了,很简单。 还有一个很重要的问题,就是如何把项目打成Javadoc,这有人应该会说,很简单啊,就是使用Eclipse或者Myeclipse的Export功能,是的,这是可以,但是有些小的方面还是需要我们强烈注意的

Cinema 4D 汉化帮助文档PDF.pdf

Cinema 4D 汉化帮助文档聚众翻译v2015.09.06 【前言】 这只是一个提议,希望有更多朋友的加入,目的没打算是把这玩意全部汉化完成,其中的困难非一小撮人可以解决的。只想能发动很多的朋友来共同学习,古语有云“眼过千遍不如手过一遍”。 其次,也是因为国内盗版盛行,官方是不会做中文帮助文档。倡议大伙多多支持正版软件以求获得官方中文帮助文档的发布 很早以前R13版本时,CG天下(论坛)曾发动过付费的帮助文档的汉化,最终任务艰巨而放弃(猜的)。我在想象,如果这一次的倡议,参与翻译的同学名字能在这个页面写上一千多位,那么真就是全民汉化的奇迹了,目前也就“呵呵”而已吧。做过总比想了不错的好,不怕失败就怕放弃。 话说回来,校对同学是很重要的,需要对C4D软件很了解,校正其中命令菜单的翻译。然后是翻译,还有不可缺少的编辑同学,翻译完成,需要填写进html文档中。估计会有很多同学不会编辑html,当然,若自己能编辑最好了,你可以独立发布,也可以整理在我发布的这个版本中。 支持的同学再多,也敌不过你的加入。 其中菜单命令的翻译,都是在软件中切换中英文来查找的官方中文命令。希望刚开始能有个严谨的态度吧。虽然我也不会英文,也是通过各种汉化工具来做的,每学习一两条,从此进步速速哒,哈哈。 【汉化方法】 方法有多中,首先打开软件安装目录。可以在桌面图标上右键→打开文件所在的位置。或者在这个目录下“X:\Program Files\MAXON\CINEMA 4D R17\help\US\html 全部都是html文件,三千多个。Ctrl+a 全选,右键→属性 取消“只读”的勾选,这样才能编辑文档。 一、使用 notepad++ 软件修改。全部代码编辑,适合码农,编辑性能卓越,操作指数困难。从C4D中打开帮助面板,选择一个你想翻译的页面。右键→属性 地址栏中“5425.html”便是文件名称。 然后在帮助文档的文件夹中“X:\Program Files\MAXON\CINEMA 4D R17\help\US\html”搜索“5425.html”使用notepad++软件打开。

中文帮助文件精选

英文版对应中文目录(2009) 3 执行概况 3 科研与开发 3 市场营销 4 生产 4 财务 5 公司的成功 5 传感器工业 5 传感器的顾客 5 各群体的购买标准 6 定位 7 价格, 年龄, 和可靠性 7 各群体的标准 8 Foundation?快讯 8 首页, 股票和债券总结, 财务报表和生产分析 8 群体分析 9 可达性、市场占有率和产品排行榜 10 市场份额报告和直观图 10 人力资源 / 全面质量管理报告 11 预计报告和年度报告11 资产负债表 11 现金流量表 11 收益表 12 购买决策 12 粗略删减 12 粗删阶段的定位 12 粗删阶段的价格 12 粗删阶段的可靠性 13 精细筛选 13 精选阶段的定位 13 精选阶段的价格 13 精选阶段的可靠性 14 年龄 14 市场因素 14 知名度 14 获得产品难易度 14 卖方市场 15 市场规模与发展 15 以销售量计算的市场规模 15 生产 15 科研与开发 16 改变速度, 尺寸和可靠性 16 开发新产品 16 项目管理 17 产品的年龄 18 市场营销 18 产品定价 18 宣传和销售预算 19 销售预测 20 生产 20 生产力 21 改变自动化程度 21 财务 21 短期债务 22 债券 23 股票 23 紧急贷款 23 信用政策 24 附加模块 24 人力资源 25 全面质量管理 25 形式分析 25 直观图 26 客户需求中心和需求的改变 26 理想点 27 工业需求分析 28 生产能力分析 29 边际分析 30 边际潜力 31 消费者调查报告 32 预测 32 基本预测方法 32 定性分析 33 年底顾客调查报告 33 预测, 预计报告和年底的现金状况 33 最坏情况 / 最好情况 34 六大基本策略34 以产品寿命周期为中心的成本领袖 策略 34 以产品寿命周 期为中心的区别策略 35 全面成本领袖策略 35 全面区别策略 35 壁龛成本领袖策略(低技术) 35 壁龛区别策略(高技术) 36 平衡计分卡36 对你公司的指导 37 索引

Sapera LT帮助文档 中文版

Sapera帮助文档 简介:Sapera LT 是一套用于图像采集、显示和控制的独立于硬件以外的 C 和C++ 软件库,支持所有DALSA Coreco 硬件平台。它的综合功能集包括程序可移植性、多样化的相机控制、灵活的显示和管理功能,以及易于使用的应用开发向导。Sapera LT 与Microsoft Visual Studio C/C++、.Net、Visual Basic 6.0 和Borland C++ Builder 兼容,支持Windows XP、2000 和NT 平台。 一.Sapera++介绍 Sapera++是Sapera LT为用户提供的API. Sapera++ 包含两大类:基础应用类(Basic Classes)和GUI类(GUI Classes)。 1.基础应用类: 提供了用户进行图像开发的基本函数,命名方式为Sap+类功能名,其结构如下图所示: Sapera Basic Class 函数功能介绍: Data Classes: 功能:下属多个数据类,每一个数据类管理了一种特定数据类型 下属数据类:SapData Class SapDataHSI Class SapDataHSV Class SapDataFloat Class SapDataFPoint Class SapDataFRGB Class SapDataMono Class SapDataPoint Class SapDataRGB Class

SapDataRGBA Class SapDataYUV Class ●SapAcquisition 功能:控制与板卡相连接的采集设备 常用函数:SapAcquisition::SapAcquisition SapAcquisition::Create SapAcquisition::Destroy SapAcquisition::ApplyLut SapAcquisition::GetParameter, SapAcquisition::SetParameter SapAcquisition::GetSignalStatus SapAcquisition::IsSignalStatusAvailable ●SapAcqCallbackInfo 功能:存储SapAcquisition类回调的内容 常用函数:SapAcqCallbackInfo::GetContext SapAcqCallbackInfo::GetSignalStatus ●SapAcqDevice 功能:由设备读、写信息,还可直接发送、寄存事件至设备。常用于直接连接电脑的相机(如GigE相机) 常用函数:SapAcqDevice::SapAcqDevice SapAcqDevice::Create SapAcqDevice::Destroy SapAcqDevice::GetConfigFile, SapAcqDevice::SetConfigFile SapAcqDevice::UpdateFeaturesFromDevice ●SapAcqDeviceCallbackInfo 功能:存储SapAcqDevice类回调的内容 常用函数:SapAcqDeviceCallbackInfo::SapAcqDeviceCallbackInfo SapAcqDeviceCallbackInfo::GetAcqDevice ●SapBayer 功能:Bayer转换操作(分为软件和硬件实现两种) 常用函数:SapBayer::WhiteBalance SapBayer::EnableLut SapBayer::GetAlign, SapBayer::SetAlign SapBayer::GetWBGain, SapBayer::SetWBGain ●SapBuffer 功能:操作buffer资源 常用函数:SapBuffer::SapBuffer SapBuffer::Create SapBuffer::Clear SapBuffer::Destroy SapBuffer::GetParameter, SapBuffer::SetParameter SapBuffer::GetPitch SapBuffer::GetPixelDepth, SapBuffer::SetPixelDepth SapBuffer::GetIndex, SapBuffer::SetIndex

EA帮助文档(中文)

## Enterprise Architect帮助文档 帮助文档翻译

目录 简介 (2) 从此处开始 (2) 使用EA (2) 用EA建模 (2) 模型管理 (2) 项目管理 (2) 编码工程 (2) 调试和配置文档 (2) 数据建模 (2) 一张数据表格 (2) 创建一个表格 (3) 设置表格属性 (4) 创建字段 (9) 创建Oracle包 (11) 主键 (11) 外键 (12) 存储过程 (17) 视图 (21) 索引,触发器和检查约束 (23) 生成DDL (25) 把一个包生成DDL (25) 进程的数据类型转换 (26) 包的数据类型转换 (27) 数据库管理系统数据类型 (28) 从开放式数据库中导入数据库模式 (29) 转化MDA (33) XML技术 (33) 生成文档 (33) EA扩展 (33) UML字典 (33) 项目角色和EA (33) 授权管理 (33) 术语 (33)

简介 从此处开始 使用EA 用EA建模 模型管理 项目管理 编码工程 调试和配置文档 数据建模 一张数据表格 下面展示了一个数据模型表,上面有三个表格,相互之间用主外键连接起来。上面同样展示了主外键的操作。你也可以添加其他操作:检验,触发器,约束性,索引。

一个数据模型表在EA中表现为一个类表,创建方法和其他类型的表一样。 创建一个表格 什么是表 关系模型数据库中,最基础的模型结构就是“表”。一个表代表了具有相同结构的一系列记录。UML数据模型配置文件中的表表现为一个衍型类,这就是说,一个带着衍型的类元素作用于它之上。一个表的图标表示在图表的右上方。 创建一个表 通过以下步骤创建一个表: 1、选择一个表; 2、选择工具条选项中的更多工具|扩展|数据模型菜单; 3、点击元素列中的表格元素,然后点击表。一个表格就展示在表上了;

@Material Studio中文版帮助手册

欢迎 欢迎使用Materials Studio Materials Studio是一个采用服务器/客户机模式的软件环境,它为你的PC机带来世界最先进的材料模拟和建模技术。 Materials Studio使你能够容易地创建并研究分子模型或材料结构,使用极好的制图能力来显示结果。与其它标准PC软件整合的工具使得容易共享这些数据。 Materials Studio的服务器/客户机结构使得你的Windows NT/2000/XP,Linux和UNIX服务器可以运行复杂的计算,并把结果直接返回你的桌面。 Materials Studio采用材料模拟中领先的十分有效并广泛应用的模拟方法。Accelry’s的多范围的软件结合成一个集量子力学、分子力学、介观模型、分析工具模拟和统计相关为一体容易使用的建模环境。卓越的建立结构和可视化能力和分析、显示科学数据的工具支持了这些技术。 无论是使用高级的运算方法,还是简单地利用Materials Studio增强你的报告或演讲,你都可以感到自己是在用的一个优秀的世界级材料科学与化学计算软件系统。 易用性与灵活性 Materials Studio可以在Windows 98,Me,NT,2000和XP下运行。用户界面符合微软标准,你可以交互控制三维图形模型、通过简单的对话框建立运算任务并分析结果,这一切对Windows用户都很熟悉。 Materials Studio的中心模块是Materials Visualizer。它可以容易地建立和处理图形模型,包括有机无机晶体、高聚物、非晶态材料、表面和层状结构。Materials Visualizer 也管理、显示并分析文本、图形和表格格式的数据,支持与其它字处理、电子表格和演示软件的数据交换。 Materials Studio是一个模块化的环境。每种模块提供不同的结构确定、性质预测或模拟方法。你可以选择符合你要求的模块与Materials Visualizer组成一个无缝的环境。你也可以把Materials Visualizer作为一个单独的建模和分子图形的软件包来运行。 如果你安装了Materials Studio的其它模块,后台运算既可以运行在本机,也可以通过网络运行在远程主机上。这取决于你建立运算时的选择和运算要求。Materials Studio的客户机/服务器模式支持服务器端运行在Windows NT/2000/XP,Linux或UNIX下,使得你可以最大化利用计算资源。 效率和交流 所以的研究人员都可以从Materials Studio强大功能中获益。这份文档的“演示”部分给出了一些简单的分子和材料的模型。这能使你获得对材料的更好的理解并能创建优秀的图形。与其它Windows软件的协同工作使得能容易地拷贝粘贴这些图形到其它文档。结构和性质的数据能容易地从电子表格和数据库中导入导出。Materials Studio帮助你显示和共享数据。Materials Visualizer也可以安装在研究部门、生产部门、

python-os模块中文帮助文档

注此模块中关于unix中的函数大部分都被略过,翻译主要针对WINDOWS,翻译速度很快,其中很多不足之处请多多包涵。 这个模块提供了一个轻便的方法使用要依赖操作系统的功能。如何你只是想读或写文件,请使用open() ,如果你想操作文件路径,请使用os.path模块,如果你想在命令行中,读入所有文件的所有行,请使用 fileinput模块。使用tempfile模块创建临时文件和文件夹,更高级的文件和文件夹处理,请使用shutil模块。 os.error 内建OSError exception的别名。 https://www.360docs.net/doc/7e16004385.html, 导入依赖操作系统模块的名字。下面是目前被注册的名字:'posix', 'nt', 'mac', 'os2', 'ce', 'java', 'riscos'. 下面的function和data项是和当前的进程和用户有关 os.environ 一个mapping对象表示环境。例如,environ['HOME'] ,表示的你自己home文件夹的路径(某些平台支持,windows不支持) ,它与C中的getenv("HOME")一致。 这个mapping对象在os模块第一次导入时被创建,一般在python启动时,作为site.py处理过程的一部分。在这一次之后改变environment不 影响os.environ,除非直接修改os.environ. 注:putenv()不会直接改变os.environ,所以最好是修改os.environ 注:在一些平台上,包括FreeBSD和Mac OS X,修改environ会导致内存泄露。参考putenv()的系统文档。 如果没有提供putenv(),mapping的修改版本传递给合适的创建过程函数,将导致子过程使用一个修改的environment。 如果这个平台支持unsetenv()函数,你可以删除mapping中的项目。当从os.environ使用pop()或clear()删除一个项目时,unsetenv()会自动被调用(版本2.6)。 os.chdir(path) os.fchdir(fd) os.getcwd() 这些函数在Files和Directories中。

iText中文帮助文档

第一部分iText的简单应用 第一章创建一个Document 利用iText五步创建一个PDF文件:helloword。 第一步,创建一个 iTextSharp.text.Document对象的实例: Document document = new Document(); 第二步,为该Document创建一个Writer实例: PdfWriter.getInstance(document, new FileStream("Chap0101.pdf", FileMode.Create)); 第三步,打开当前Document document.Open(); 第四步,为当前Document添加内容: document.Add(new Paragraph("Hello World")); 第五步,关闭Document document.Close(); 完整的代码见示例代码0101。 在例中,不难看出,制作一个PDF文件是非常简单的。 注:如果你将例中“document.Add(new Paragraph("Hello World"));”中的字符串“Hello Word”换成中文,如“这是我的第一个PDF文件”,产生的结果一定让你大失所望,因为生成的PDF文件中并没有将中文显示出来,不要担心,在第9章中要专门讲解字体问题,中文显示也就迎刃而解了,如果不能正确显示中文,也就没有必要翻译本文了。 下面对这几步做详细介绍。 第一步创建一个Document实例: iTextSharp.text.Document-object共有三个构造函数:

public Document(); public Document(Rectangle pageSize); public Document(Rectangle pageSize, int marginLeft, int marginRight, int marginTop, int marginBottom); 第一个构造函数以A4页面作为参数调用第二个构造函数,第二个构造函数以每边36磅页边距为参数调用第三个构造函数 ◆页面尺寸: 你可以通过指定的颜色和大小创建你自己的页面,示例代码0102创建一个细长的浅黄色背景的页面: Rectangle pageSize = new Rectangle(144, 720); pageSize.BackgroundColor = new Color(0xFF, 0xFF, 0xDE); Document document = new Document(pageSize); 通常,你不必创建这样的页面,而可以从下面页面尺寸中选择: A0-A10, LEGAL, LETTER, HALFLETTER, _11x17, LEDGER, NOTE, B0-B5, ARCH_A-ARCH_E, FLSA 和 FLSE 大多数情况下使用纵向页面,如果希望使用横向页面,你只须使用rotate()函数: Document document = new Document(PageSize.A4.rotate()); 详细代码见示例代码0103。 ◆页边距: 当创建一个文件时,你还可以定义上、下、左、右页边距: Document document = new Document(PageSize.A5, 36, 72, 108, 180); 在示例代码0104中你可以看到该文档有一个0.5英寸的左边距和1英寸的右边距,上边距为1.5英寸,下边距为2.5英寸。

Fragstats4.1帮助文档中文版(谷歌翻译)

概述 什么是FRAGSTATS FRAGSTATS是空间格局的分析程序来表示景观结构的景观镶嵌模型分类地图。请注意,FRAGSTATS不适合代表景观结构的景观梯度模型的连续表面地图。景观受分析是用户定义的,并且可以表示任何空间的现象。FRAGSTATS简单量化作为分类地图所代表的景观空间异质性;这是义不容辞的用户建立了良好的基础定义和缩放景观的主题内容和分辨率和空间的粮食和程度方面。我们强烈建议您阅读使用该程序之前,FRAGSTATS背景部分。重要的是,从FRAGSTATS输出才有意义,如果定义的景观是有意义的相对于正在审议的现象。 规模的注意事项 FRAGSTATS需要的空间谷物或网格的分辨率是>0.001米,但它放置没有限制对景观本身的空间范围,虽然有对可加载的网格的尺寸存储器的限制。然而,在计算FRAGSTATS的移动距离和面积为基础的度量报道平方米,公顷,分别。因此,极端的程度和/或分辨率的景观可导致相当麻烦的数字和/或受舍入误差。然而,FRAGSTATS输出,可以使用任何数据库管理程序,以重新调整指标或将其转换为其他单位(例如,转换公顷亩)被操纵以ASCII格式的数据文件。 计算机要求 FRAGSTATS是一个用微软的Visual C单机+ +程序在Windows操作系统环境中使用,是一个32位进程(即使运行的是64位计算机上)。FRAGSTATS的开发和在Windows 7操作系统上进行测试,尽管它应该在所有的Windows操作系统上运行。请注意,FRAGSTATS是高度依赖于平台,因为它是在Microscroft环境下开发的,所以移植到其他平台上是不容易实现的。FRAGSTATS是计算密集型的程序;其性能取决于两个处理器速度和计算机存储器(RAM)。最后,处理的图像的能力依赖于足够的存储器可用,并且处理该图像的速度依赖于处理器速度。 特别值得注意的是该存储器的约束。FRAGSTATS是一个32位的过程,因此,最多只能使用2GB的内存;但如果正确配置Windows可以让32位进程看高达3GB的内存。FRAGSTATS加载输入电网到内存中,然后计算所有要求的计算。因此,你必须拥有足够的内存来加载网格,然后足够的剩余处理和其他操作系统的需求。作为一个指南,以帮助确定是否有足够的内存来处理特定的网格,你可以用下面的公式:#电池*4字节。因此,如果你有256行,256列格,内存要求为256 KB(256*256* 4/1024字节/ KB)只是加载网格;你还需要其它更多的内存来处理电网,满足您的其他操作系统的需求。不幸的是,它几乎是不可能的,以确定准确的存储器需求超出了需要加载的网格,因为它取决于许多未知因素,例如有多少斑块有。内存要求并不特别限制在一个标准的分析,除非你正在使用大型图像和有限的内存。一个潜在的解决了这个问题,如果它出现了- 遗憾的是- 是让更多的内存,但这是有限度的,如上所述。另一个解决方案是重新取样网格较粗分辨率,有效地减少了网格大小,但是这是唯

ansys-中文帮助手册(含目录-word版本)

目录 第1 章开始使用ANSYS 1 1.1 完成典型的ANSYS 分析 1 1.2 建立模型 1 第2 章加载23 2.1 载荷概述23 2.2 什么是载荷23 2.3 载荷步、子步和平衡迭代24 2.4 跟踪中时间的作用25 2.5 阶跃载荷与坡道载荷26 2.6 如何加载27 2.7 如何指定载荷步选项68 2.8 创建多载荷步文件77 2.9 定义接头固定处预拉伸78 第3 章求解85 3.1 什么是求解84 3.2 选择求解器84 3.3 使用波前求解器85 3.4 使用稀疏阵直接解法求解器86 3.5 使用雅可比共轭梯度法求解器(JCG)86 3.6 使用不完全乔列斯基共轭梯度法求解器(ICCG)86 3.7 使用预条件共轭梯度法求解器(PCG)86 3.8 使用代数多栅求解器(AMG)87 3.9 使用分布式求解器(DDS)88 3.10 自动迭代(快速)求解器选项88 3.11 在某些类型结构分析使用特殊求解控制89 3.12 使用PGR 文件存储后处理数据92 3.13 获得解答96 3.14 求解多载荷步97 3.15 中断正在运行的作业100 3.16 重新启动一个分析100 3.17 实施部分求解步111 3.18 估计运行时间和文件大小113

3.19 奇异解114 第4 章后处理概述116 4.1 什么是后处理116 4.2 结果文件117 4.3 后处理可用的数据类型117 第5 章通用后处理器(POST1) 118 5.1 概述118 5.2 将数据结果读入数据库118 5.3 在POST1 中观察结果127 5.4 在POST1 中使用PGR 文件152 5.5 POST1 的其他后处理内容160 第6 章时间历程后处理器(POST26)174 6.1 时间历程变量观察器174 6.2 进入时间历程处理器176 6.3 定义变量177 6.4 处理变量并进行计算179 6.5 数据的输入181 6.6 数据的输出183 6.7 变量的评价184 6.8 POST26 后处理器的其它功能187 第7 章选择和组件190 7.1 什么是选择190 7.2 选择实体190 7.3 为有意义的后处理选择194 7.4 将几何项目组集成部件与组件195 第8 章图形使用入门198 8.1 概述198 8.2 交互式图形与“外部”图形198 8.3 标识图形设备名(UNIX 系统)198 8.4 指定图形显示设备的类型(WINDOWS 系统)201

windpro(2)中文版帮助文件

WindPRO课程 ‐ 基础模块 Day 1 ‐ Lesson 1 创建新项目并添加背景地图 目的: 创建一个新项目和用于项目设计的文件结构。对项目浏览器和项目属性进行操作。加入背景地图。合并多重地图,定义新地图,导入在线地图。 练习大纲: 1.将预备数据放入新的文件夹 2.通过项目浏览器创建一个新工程 3.设置项目属性 4.通过设定三点坐标,使用“定义新地 图”,创建新地图 5.导入BMI格式地图 6.导入在线地图 7.将地图导入工作区,验证导入地图的正确 性 1.数据准备 在C:\WindPRO Data\Projects\创建一个新文件夹并命名,例如“WindPRO_Course_2010”。 将课程光盘中名为“Course_data”的文件夹复制到工程文件夹内。 注释:最好为每一个项目创建一个新文件夹,将项目的所有相关数据存储在同一个文件夹中。 2.通过项目浏览器创建一个新工程 启动 WindPRO,打开项目浏览器。 注释:项目浏览器是一个界面,通过该界面,可以开始一个新项目或者查看/打开已有的 WindPRO项目。可以点击按钮回到项目浏览器界面。 点击新建项目旁边的+图标 如下,将 + 移至地图上项目场址的大概位置

WindPRO 课程 ‐ 基础模块 Day 1 ‐ Lesson 1 点击“+” 图标右侧的“打开新项目”图标。 打开之前你建立的文件夹,输入项目名称并点击“保存”。 这样,你将建立1个.w3p 文件(WindPRO 工程文件),该文件包含对象中的所有数据和计算结果。 3. 设置项目属性 注释:当创建一个新项目时,项目属性窗口将自动弹出。可以通过点击此按钮 回到项目属性表页。 在项目属性中选择时区为(GMT+08:00) 北京,重庆,香港特别行政区,乌鲁木齐。 选择坐标系统为 UTM WGS84, 区域49。 注释:知道将用于WindPRO 项目的图像文件的坐标系统和基准是非常必要的。例如,美国最常用的的坐标系统是UTM (通用横向麦卡托图) ,NAD 27 Conus 和WGS84则是最常用的基准。而我国最常用的基准是北京54或西安80。 4. 使用“定义新地图”通过设定三个点定 义新地图 注释:一般来说,需要一张包含项目周边至少20Km 的大比例的地形图(1:100,000)。同时需要一张更加详细的地形图(1:24,000),该地图至少包含项目周边5Km 。同时可以使用航空照片。背 景地图对项目设计是非常必要的。 进入项目属性中的“背景地图”表页。 通常我们使用的是.jpg 或.bmp 格式的地图,它不包含坐标。对于这种地图,可以使用“定义新地图”、通过在地图上标定三个不同的点来实现。使用Maps 文件夹中的下列图形文件进行练习。

官方Flash CS3简体中文帮助文档下载

[转]官方Flash CS3简体中文帮助文档下载,AS3.0简体中文帮助文档下载 这些是在线版本:Flash CS3 文档: https://www.360docs.net/doc/7e16004385.html,/flash/9.0_cn/main/wwhelp/wwhimpl/js/html/wwhelp.htm ActionScript 3.0 语言(各包类的使用方法)和组件参考 https://www.360docs.net/doc/7e16004385.html,/flash/9.0_cn/ActionScriptLangRefV3/index.html Flash Video Encoder 用户指南 https://www.360docs.net/doc/7e16004385.html,/flash/9.0_cn/flvencoder/wwhelp/wwhimpl/js/html/wwhelp.htm ----------这些是pdf版:) (感谢网友Jubu提供) https://www.360docs.net/doc/7e16004385.html,/flash/9.0_cn/main/flash_as3_programming.pdf 这个就是AS3 的中文帮助PDF 版 https://www.360docs.net/doc/7e16004385.html,/flash/9.0_cn/main/flash_as3_components_help.pdf 这个是组件的帮助 https://www.360docs.net/doc/7e16004385.html,/flash/9.0_cn/flvencoder/flash_video_encoder_help.pdf 这个是视频的帮助 https://www.360docs.net/doc/7e16004385.html,/flash/9.0_cn/UsingFlash/flash_cs3_help.pdf 这个是入门设计不含代码方面的帮助

Lapack中文帮助手册手册

https://www.360docs.net/doc/7e16004385.html,PACK LAPACK简介 1.1概述 LAPACK API支持两种形式:一是标准的ANSI C;另一种是标准的FORTRAN77。LAPACK 是开源的,官方网站是:https://www.360docs.net/doc/7e16004385.html,/lapack/。 每个LAPACK例程都有四个形式,具体描述如下: 精度例程前缀 REAL精度S REAL DOUBLE精度D COMPLEX单精度C COMPLEX双精度Z 下面例程是经过优化的。 DGETRF对一般矩阵进行LU分解。 DGETRS线性方程组求解。 DGETRI用LU分解求解一般矩阵的逆矩阵。 DGEQRF对一般矩阵进行QR分解。 DGELQF对一般矩阵进行LQ分解。 DPOTRF对对称正定矩阵进行Cholesky分解。 DPOTRS对线性方程组(对称正定)求解。 1.2函数的命名规则: LAPACK里的每个函数名已经说明了该函数的使用规则。所有函数都是以XYYZZZ的形式命名,对于某些函数,没有第六个字符,只是XYYZZ的形式。 第一个字母X代表以下的数据类型: S REAL,单精度实数 D DOUBL E PRECISION,双精度实数 C COMPLEX,单精度复数 Z COMPLEX*16或DOUBLE COMPLEX 注: 在新版LAPACK中含有使用重复迭代法的函数DSGESV和ZCDESV。 头2个字母表示使用的精度: DS输入数据是double双精度,算法使用单精度 ZC输入数据是complex*16,算法使用complex单精度复数 接下面两个字母YY代表数组的类型。 BD bidiagonal,双对角矩阵 DI diagonal,对角矩阵 GB general band,一般带状矩阵 GE general(i.e.,unsymmetric,in some cases rectangular),一般情形(即非对称,在有些情形下为矩形) GG general matrices,generalized problem(i.e.,a pair of general matrices),一般矩阵,广义问题(即一对一般矩阵) GT general tridiagonal,一般三对角矩阵 HB(complex)Hermitian band,(复数)厄尔米特带状阵HE(complex)Hermitian,(复数)厄尔米特矩阵

7z命令行使用中文帮助文档完整版

常规信息 支持格式 格式压缩支持解压缩支持文件扩展名 7z X X 7z XZ X X xz ZIP X X zip GZIP X X gz gzip tgz BZIP2 X X bz2 bzip2 tbz2 tbz TAR X X tar LZMA X lzma RAR X rar CAB X cab ARJ X arj Z X z taz CPIO X cpio RPM X rpm DEB X deb LZH X lzh lha SPLIT X 001 002 ... CHM X chm chw hxs ISO X iso UDF X iso 混合型文件X msi doc xls ppt WIM X wim swm DMG X dmg XAR X xar HFS X hfs NSIS X exe NTFS X ntfs FAT X fat VHD X vhd MBR X mbr

ZIP 7-Zip 完全兼容ZIP 压缩档案的创建。这就意味着每位用户都可以使用任何兼容ZIP 压缩档案的解码器来释放里面的文件。并且7-Zip 支持下列算法的ZIP 文件: ?0 - Store ?8 - Deflate ?9 - Deflate64 ?12 - Bzip2 ?14 - LZMA ?98 - PPMd ? 1 - Shrink (仅解压缩) ? 6 - Implode (仅解压缩) 使用其它压缩算法的ZIP 文件目前7-Zip 尚无法支持。但是目前大部分ZIP 文件所用的压缩算法7-Zip 都可以很好的支持,您不必担心其兼容性。但个别不支持的算法您需要使用其它的ZIP 工具来打开。 7-Zip 支持ZIP 格式的扩展版本Zip64。 目前7-Zip 不支持Zip 的多卷压缩文件。 LZH 7-Zip 只支持LZH 压缩档案的列表、浏览和解压缩。7-Zip 支持-lh0-、-lh4-、-lh5-、-lh6- 和-lh7- 算法。 7z 格式 7z是一种新的压缩格式,它拥有极高的压缩比。 7z格式的主要特征: ?公开的结构编辑功能 ?高的压缩比 ?强大的AES-256 加密 ?可更改和配置压缩的算法 ?最高支持16000000000 GB 的文件压缩 ?以Unicode 为标准的文件名

水晶报表帮助文档(中文)

水晶报表 1水晶报表专业版1 1.1概述1 1.2广泛的数据访问 2 1.3访问任何数据源 2 1.4数据访问控制2 1.5强大的报表设计功能 3 1.6可视化的设计环境3 1.7强大的公式语言 3 1.8丰富的数据表现力3 1.9提高生产力 3 1.10提高报表设计的效率 3 1.11减少报表维护量 3 1.12用户交互性 3 1.13报表查看 3 1.14报表交互性 3 1.15报表导航 3 2 Crystal Reports Server 3 2.1概述3 2.2功能和组件 3 2.3客户利益3 2.4信息3 2.5问题3 2.6需求3 2.7结论3 3水晶报表.NET开发特性 3 3.1概述3 3.2 .NET集成开发环境中内置的功能 3 3.3水晶报表开发版的功能特点3 4水晶报表Java开发特性 3 4.1功能概述3 4.2水晶报表开发版的功能特点3 1水晶报表专业版 1.1概述 销售管理团队希望更新全球的销售预测,以便在季度会议上演示。不幸的是,所有的订单和销售数据都保存在遍布全球的各自独立的数据库中。如果不能在一张报表中访问所有的数据源,就只能创建多张报表,但是多张报表的信息很难比较。最后,销售团队只能演示不太准确的修改过的销售预测。 您需要为一个潜在的新客户做一场重要的演示,需要通过专业的报表吸引客户。然而,您只能设计出简陋的展示原始数据的报表,缺乏生动的图形。结果,您最后还是输给了能够提供专业展现形式的报表的竞争对手。 您花费了大量的精力为财务团队创建财务报表。由于财务团队对公司财务信息的需求不

断变化,但是他们又不能自己修改报表,因此每次都必须通过您来更新和优化报表。但是您还有其他大量的报表工作要完成,因此不能及时提交满足财务团队的需求。结果导致,财务团队经常无法得到最新数据的报表,或者报表的格式不能满足其需求。 以上这些情景是不是似曾相熟? 您可以用一个报表工具访问所有的数据源吗?您能够为客户创建专业的报表吗?您常常为了满足公司变动的商业需求而花费大量的时间修改和维护报表吗? Crystal Reports?——被广泛验证过的世界级标准的解决方案——让您根据关系型数据库、OLAP、XML或者其他自定义的数据源设计出灵活的、丰富的报表。Crystal Reports提供了100多个格式化选项,让您可以完全控制数据的访问和表现形式。最终用户可以在报表中进行钻取、对信息进行排序和过滤、打印报表、甚至修改报表以获得所需的信息。您也可以将报表导出为PDF、Excel和Word等格式。在Crystal Reports XI中,引入了包括动态级联在内的多种特性,有助于提高报表的开发效率,减少冗余的报表维护工作,让您可以将精力投入到更加重要的任务上。 1.2广泛的数据访问 从多个数据源访问数据和合并数据通常是很复杂的事情,需要多个工具。通过Crystal Reports所提供的强大的数据驱动和灵活的访问形式,您可以连接所需要的数据。 1.3访问任何数据源 通过Crystal Reports所提供的广泛的数据访问特性,您可以简单地访问企业数据以满足最终用户的信息需求。无论您需要与数据库、文件、日志、企业应用程序还是程序单元建立本地、ODBC、OLE DB或JDBC连接,Crystal Reports都是满足您所有需求的唯一一种工具。Crystal Reports内置了超过35种数据驱动,可以直接访问任何关系型数据库、OLAP、XML 或者内存中的数据,Crystal Reports XI中升级了XML、JDBC、IBM DB2和Exchange数据驱动,为您提供了更多的数据访问选项。此外,使用Crystal Reports也可以很容易地在同一张报表中展现来自多个数据库不同语言的数据。 1.4数据访问控制 Crystal Reports可以让您灵活地控制数据连接。您可以写SQL命令,或者利用Crystal Reports强大的查询语句生成功能。此外,业务视图可以消除报表从开发状态向产品状态迁移的繁琐工作。 1.5强大的报表设计功能 使用Crystal Reports高度灵活性的设计环境,您可以更加快速简便地设计报表,创建高度格式化的、展现形式丰富的报表,满足客户的信息需求。 1.6可视化的设计环境 提供直观的、可拖放对象的、交互性用户界面,提供可选的向导工具以简化常见的报表任务,例如连接数据源、选择、分组、排序和汇总。初学者可以设计和应用自定义的报表模板,为数据访问及其展现格式制定标准,以确保报表之间的设计风格一致。您也可以将现有的报表作为模板。 1.7强大的公式语言 Crystal Reports提供可扩展的公式语言,内置了超过160种函数和操作符,以控制报表的格式、复杂的逻辑和数据选择。Crystal Reports提供了零代码的公式向导。通过使用自定义的函数,您可以在报表之间共享和重用公式逻辑,从而避免冗余的公式创建。您也可以创建数据库中所没有的汇总信息等。 1.8丰富的数据表现力 您可以创建几乎任何格式的报表,包括交叉表、TopN/BottomN报表、汇总/钻取报表、表单、邮件标签、OLAP、子报表等。Crystal Reports提供了完整的布局和设计控制项,在

相关主题
相关文档
最新文档