0

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

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());

not always received 具有应有的整个实体。

4

1 回答 1

2

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

于 2010-03-31T14:12:54.210 回答