如何使用httpcore库从get请求中获取整个实体

时间:2010-03-30 14:19:06

标签: java apache-httpcomponents

我正在使用Apache Http-core library,但我遇到了httpResponse消息实体的问题。 有时,当我收到带有多个TCP数据包的Http响应时,由于某种原因,最后一个数据包被丢弃。 用于此项目的类是:

public class HttpSocketHandler
{
private String address;
private int port;
private Socket socket = null;
private HttpParams params = null;
private DefaultHttpClientConnection conn = null;
private BasicHttpProcessor httpproc;
private HttpRequestExecutor httpexecutor;
private HttpContext context;

public HttpSocketHandler(String address, int port)
{
    this.params = new BasicHttpParams();
    httpexecutor = new HttpRequestExecutor();
    context = new BasicHttpContext(null);
    this.conn = new DefaultHttpClientConnection();
    this.address = address;
    this.port = port;
    this.httpproc = new BasicHttpProcessor();
    httpproc.addInterceptor(new RequestContent());
    httpproc.addInterceptor(new RequestTargetHost());
    // Recommended protocol interceptors
    httpproc.addInterceptor(new RequestConnControl());
    httpproc.addInterceptor(new RequestUserAgent());
    httpproc.addInterceptor(new RequestExpectContinue());

    context.setAttribute(ExecutionContext.HTTP_CONNECTION, conn);
    context.setAttribute(ExecutionContext.HTTP_TARGET_HOST, new HttpHost(address,port));


}

public void InitializeConnection() throws MalformedURLException, UnknownHostException, IOException
{
    if (address == null)
    {
        throw new MalformedURLException();
    }
}

public synchronized HttpResponse sendPostMessage(String URL, Hashtable<String, String> headers, byte[] toBeSent) throws UnsupportedEncodingException, HttpException, IOException
{
    this.socket = new Socket(address, port);
    this.conn.bind(this.socket, this.params);
    BasicHttpEntityEnclosingRequest ToSend = new BasicHttpEntityEnclosingRequest("POST", URL);
    //ToSend.setEntity(new StringEntity(toBeSent, "UTF-8"));
    ToSend.setEntity(new ByteArrayEntity(toBeSent));
    ToSend.setParams(params);
    httpexecutor.preProcess(ToSend, httpproc, context);
    if (headers != null)
    {
        Set<Entry<String, String>> hs = headers.entrySet();
        Iterator<Entry<String, String>> it = hs.iterator();
        Entry<String, String> tmp;
        while (it.hasNext())
        {
            tmp = it.next();
            ToSend.setHeader(tmp.getKey(), tmp.getValue());
            System.out.println(tmp.getKey() + " : " + tmp.getValue());
        }
    }

    HttpResponse response = httpexecutor.execute(ToSend, conn, context);
    response.setParams(params);
    this.conn.close();
    return response;
}

public synchronized HttpResponse sendGetMessage(String URL, Hashtable<String, String> headers) throws IOException, HttpException
{
    this.socket = new Socket(address, port);
    this.conn.bind(this.socket, this.params);

    BasicHttpRequest ToSend = new BasicHttpRequest("GET", URL);

    ToSend.setParams(this.params);
    httpexecutor.preProcess(ToSend, httpproc, context);
    if (headers != null)
    {
        Set<Entry<String, String>> hs = headers.entrySet();
        Iterator<Entry<String, String>> it = hs.iterator();
        Entry<String, String> tmp;
        while (it.hasNext())
        {
            tmp = it.next();
            ToSend.setHeader(tmp.getKey(), tmp.getValue());
        }
    }

    HttpResponse response = httpexecutor.execute(ToSend, conn, context);
    response.setParams(params);
    this.conn.close();
    this.httpexecutor.postProcess(response, this.httpproc, this.context);
    //System.out.println(response.getEntity().getContentLength());
    //return EntityUtils.toString(response.getEntity());
    return response;
}

public void close() throws IOException
{
    this.conn.close();
}
}

当我使用sendGetMessage方法时,通过wireshark,我可以使用以下代码查看正确接收的所有数据包:

HttpResponse response = this.HSH.sendGetMessage("http://" + this.URL + UrlSufixes.QUERY, headers);
byte[] received = EntityUtils.toByteArray(response.getEntity());

并不总是收到整个实体,因为它被用来。

1 个答案:

答案 0 :(得分:2)

因为在完全阅读响应之前关闭了连接