Что вызывает HttpHostConnectException?

У меня есть функция Auto Complete/type ahead для поиска моего сайта. Я вижу, что некоторое время их исключение связано с ним. Мы используем прокси-сервер.

org.apache.http.conn.HttpHostConnectException: Connection to http://proxy.xyz.com:60 refused    

at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:159)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:108)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:415)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:641)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:576)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:554)
at com.xxx.dd.sone.integration.SearchDAO.getJSONData(SearchDAO.java:60)
at com.xxx.dd.sone.integration.SearchDAO.searchAutoCompleteResults(SearchDAO.java:560)
at com.xxx.dd.sone.presentation.util.SearchAutoCompleteUtil.doGet(SearchAutoCompleteUtil.java:26)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:731)
at javax.servlet.http.HttpServlet.service(HttpServlet.java:845)
at weblogic.servlet.internal.StubSecurityHelper$ServletServiceAction.run(StubSecurityHelper.java:242)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:352)
at weblogic.servlet.internal.ServletStubImpl.execute(ServletStubImpl.java:236)
at weblogic.servlet.internal.WebAppServletContext$ServletInvocationAction.run(WebAppServletContext.java:3254)
at weblogic.servlet.provider.WlsSubjectHandle.run(WlsSubjectHandle.java:57)
at weblogic.servlet.internal.WebAppServletContext.doSecuredExecute(WebAppServletContext.java:2163)
at weblogic.servlet.internal.WebAppServletContext.execute(WebAppServletContext.java:2074)
at weblogic.servlet.internal.ServletRequestImpl.run(ServletRequestImpl.java:1512)
at weblogic.servlet.provider.ContainerSupportProviderImpl$WlsRequestExecutor.run(ContainerSupportProviderImpl.java:255)
at weblogic.work.ExecuteRequestAdapter.execute(ExecuteRequestAdapter.java:22)
at weblogic.kernel.ExecuteThread.execute(ExecuteThread.java:147)
at weblogic.kernel.ExecuteThread.run(ExecuteThread.java:119)

Вызвано: java.net.ConnectException: соединение отклонено

Вот как я закодировал

public HashMap<String, Object> getJSONData(String url)throws Exception {
    DefaultHttpClient httpClient = new DefaultHttpClient();
    HttpParams params = httpClient.getParams();
    try {
        HttpConnectionParams.setConnectionTimeout(params, 10000);
        HttpConnectionParams.setSoTimeout(params, 10000);
    } catch (Exception e) {
        e.printStackTrace();
        throw e;
    }
    HttpHost proxy = new HttpHost(proxy.xyz.com, 60);
    ConnRouteParams.setDefaultProxy(params, proxy);
    URI uri;
    InputStream data = null;
        uri = new URI(url);
        HttpGet method = new HttpGet(uri);
        HttpResponse response=null;
        try {
        response = httpClient.execute(method);
        }catch(Exception e) {
            e.printStackTrace();
            throw e;
        }
        data = response.getEntity().getContent();
    Reader r = new InputStreamReader(data);
    HashMap<String, Object> jsonObj = (HashMap<String, Object>) GenericJSONUtil.fromJson(r);
    return jsonObj;
}

Может ли кто-нибудь сказать мне, почему я получаю это исключение только некоторое время? возможно ли, что это исключение вызвано тем, что запрос поиска сделан из приложений для Android, поскольку наш сайт не поддерживает запрос, поступающий из приложений Android.

Ответ 1

Ошибка "соединение отказалась", когда вы пытаетесь открыть TCP-соединение с IP-адресом/портом, где в настоящее время нет прослушивания соединений. Если ничего не слушает, ОС на стороне сервера "отказывается" от соединения.

Если это происходит с перерывами, то наиболее вероятными объяснениями являются (ИМО):

  • сервер, о котором вы говорите ("proxy.xyz.com"/порт 60), идет вверх и вниз, ИЛИ
  • между вашим клиентом и прокси-сервером есть что-то 1 которое периодически отправляет запросы неработающему хосту или что-то в этом роде.

Возможно ли, что это исключение вызвано тем, что запрос поиска сделан из приложений для Android, поскольку наш сайт не поддерживает запрос, поступающий из приложений Android.

Это кажется маловероятным. Вы сказали, что сообщение об исключении "отказалось" говорит, что это прокси-сервер, который отказывается от соединения, а не от вашего сервера. Кроме того, если сервер не будет обрабатывать определенные виды запросов, он все равно должен принять TCP-соединение, чтобы узнать, что это за запрос... прежде чем он сможет его отклонить.


1 - Например, это может быть DNS, который циклически разрешает DNS-имя для разных IP-адресов.Или это может быть балансировка нагрузки на основе IP.

Ответ 2

В моем случае проблема была отсутствующей в URL-адресе HTTP. Ошибка: "HttpHostConnectException: подключиться к someendpoint.com:80 [someendpoint.com/127.0.0.1] не удалось: соединение отклонено" Конечная точка и IP явно изменены для защиты сети.