在我的第一次尝试中,我尝试使用以下请求代码:
URL url=new URL(/* code goes here */);
HttpPost request=new HttpPost(url.toString());
request.addHeader("Connection", "close");
PipedOutputStream requestOutput=new PipedOutputStream();
PipedInputStream requestInput=new PipedInputStream(requestOutput, DEFAULT_PIPE_SIZE);
ContentType requestContentType=getContentType();
InputStreamEntity requestEntity=new InputStreamEntity(requestInput, -1, requestContentType);
request.setEntity(requestEntity);
HttpEntity responseEntity=null;
HttpResponse response=getHttpClient().execute(request); // <-- Hanging here
try {
if(response.getStatusLine().getStatusCode() != 200)
throw new IOException("Unexpected status code: "+response.getStatusLine().getStatusCode());
responseEntity = response.getEntity();
}
finally {
if(responseEntity == null)
request.abort();
}
InputStream responseInput=responseEntity.getContent();
ContentType responseContentType;
if(responseEntity.getContentType() != null)
responseContentType = ContentType.parse(responseEntity.getContentType().getValue());
else
responseContentType = DEFAULT_CONTENT_TYPE;
Reader responseStream=decode(responseInput, responseContentType);
Writer requestStream=encode(requestOutput, getContentType());
请求在上面指示的行卡住了。看起来代码试图在获得响应之前发送整个请求。回想一下,这很有道理。然而,这不是我所希望的。 :)
相反,我希望使用 Transfer-Encoding: chunked
发送请求标头,接收一个带有自己的 Transfer-Encoding: chunked
标头的 HTTP/1.1 200 OK
响应标头,然后我就可以拥有一个全双工流式 HTTP 连接来处理。
令人高兴的是,我的 HTTPClient 还有另一个基于 NIO 的异步客户端,有很好的使用示例(比如 this one)。我的问题是:
- 我对同步 HTTPClient 的行为的解释正确吗?或者是否有什么我可以做的,以继续以我描述的方式使用(更简单的)同步 HTTPClient?
- 基于 NIO 的客户端是否等待发送整个请求才寻求响应?或者我能否同时逐步发送请求和逐步接收响应?