什么导致了HttpHostConnectException?

21

我在我的网站的搜索功能中使用了自动完成/输入提示功能。我发现有时会与之相关的异常。我们正在使用代理服务器。

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应用程序发出请求?


你的代理主机是否在60端口运行?如果不是,那么会导致连接被拒绝的消息。 - Dave G
它正在运行在相同的端口上。此外,这个异常并不是每次都会发生,有时只会出现。 - pushya
不幸的是,您需要查看代理为什么拒绝连接。可能是代理配置中的错误吗? - Dave G
那个代理被公司内大多数应用程序使用。我认为配置代理不会有任何问题。还有一个问题,代理配置是否因不同平台(如Mac/Android)而异? - pushya
3个回答

39
当您尝试打开TCP连接到没有正在侦听连接的IP地址/端口时,会发生“连接被拒绝”的错误。 如果没有东西在侦听,则服务器端的操作系统将“拒绝”连接。
如果这种情况是间歇性的,那么最可能的解释是(在我看来):
- 您要访问的服务器("proxy.xyz.com" / 端口60)正在上下运行,或者 - 在您的客户端和代理之间有某些东西1 ,该东西间歇性地向无法正常工作的主机发送请求。
这可能是因为Android应用程序发出搜索请求而导致此异常吗?我们的网站不支持从Android应用程序发出请求。
这似乎不太可能。您说“拒绝连接”的异常消息显示拒绝连接的是代理而不是您的服务器。此外,如果服务器将不处理某些类型的请求,则仍必须接受TCP连接以了解请求是什么…然后才能拒绝它。
1 - 例如,可以是轮询DNS将DNS名称解析为不同的IP地址,也可以是基于IP的负载平衡器。

只是为了澄清,搜索请求将发送到另一个服务提供商,我们已经在我们的网站上实现了他们的服务。我们所做的就是将消费者的请求发送到搜索服务提供商,并显示他们发送的信息。 - pushya
你的客户端和代理之间有一些问题,不时地向一个不可用的主机发送请求,或者是什么情况?你所说的"不可用的主机"是指什么? - pushya
我们该如何解决这个问题? - eng.ahmed
我认为问题可能也是因为我的搜索框上有自动完成功能,而且当用户开始输入时,该操作会立即触发。因此,如果代理在一秒钟内看到很多调用发生,就有可能拒绝调用。一个解决方案是在用户键入一些最小字符(如3个字符)后再触发自动完成。 - pushya
1
@pushya - 这是可能的。如果你的理论是正确的,那么你提出的修复方法可能会起作用。然而,在你开始“责怪”代理之前,你需要真正的确凿证据。 - Stephen C
显示剩余4条评论

2
在我的情况下,问题是HTTP URL中缺少了一个's'。错误信息如下:"HttpHostConnectException: Connect to someendpoint.com:80 [someendpoint.com/127.0.0.1] failed: Connection refused",终点和IP显然已更改以保护网络。

1

您需要在某个时候为gradle设置代理服务器,可以尝试在.gradle文档下的gradle.properties中更改代理服务器IP地址。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接