当前位置: 首页 > 面试题库 >

Apache HTTPClient抛出java.net.SocketException:许多域的连接重置

洪弘毅
2023-03-14
问题内容

我正在创建一个(行为良好的)网络蜘蛛,并且我注意到一些服务器导致Apache HttpClient给我一个SocketException-具体来说:

java.net.SocketException: Connection reset

导致此的代码是:

// Execute the request
HttpResponse response; 
try {
    response = httpclient.execute(httpget); //httpclient is of type HttpClient
} catch (NullPointerException e) {
    return;//deep down in apache http sometimes throws a null pointer...  
}

对于大多数服务器来说,这很好。但是对于其他人,它立即引发SocketException。

导致立即发生SocketException的站点示例:http
://www.bhphotovideo.com/

效果很好(与大多数网站一样):http :
//www.google.com/

现在,如您所见,www.bhphotovideo.com可以在Web浏览器中正常加载。当我不使用Apache的HTTP客户端时,它也可以很好地加载。(这样的代码:)

 HttpURLConnection c = (HttpURLConnection)url.openConnection();  
 BufferedInputStream in = new BufferedInputStream(c.getInputStream());  
 Reader r = new InputStreamReader(in);

 int i;  
 while ((i = r.read()) != -1) {  
      source.append((char) i);  
 }

那么,为什么不只使用这段代码呢?好吧,我需要使用Apache HTTP Client中的一些关键功能

有谁知道是什么原因导致某些服务器导致此异常?

到目前为止的研究:

  • 我的本地Mac开发人员机器和AWS EC2实例上出现问题,因此它不是本地防火墙。

  • 似乎该错误不是由远程计算机引起的,因为异常未显示“ by peer”

  • 此堆栈溢出似乎与java.net.SocketException有关:重新设置了连接,但答案并未显示出为什么仅从Apache HTTP Client而不是其他方法会发生这种情况。

奖励问题:我正在使用此系统进行大量爬网。除了Apache HTTPClient之外,通常还有更好的Java类吗?我发现了许多问题(例如,我必须在上面的代码中捕获到NullPointerException)。HTTPClient似乎对服务器通信非常挑剔-比我想要的爬虫更挑剔,而该爬虫在服务器不工作时不会仅仅中断。

谢谢大家!

老实说,我没有一个完美的解决方案,但是它有效,所以对我来说已经足够了。

正如下面的oleg所指出的那样,Bixo创建了一个爬网程序,该爬网程序自定义了HttpClient,以更加容忍服务器。为了“解决”这个问题而不是解决问题,我只是在这里使用了Bixo提供的SimpleHttpFetcher
:(已删除链接-因此认为我是垃圾邮件发送者,因此您必须自己使用Google搜索)

SimpleHttpFetcher fetch = new SimpleHttpFetcher(new UserAgent("botname","contact@yourcompany.com","ENTER URL"));
try {
    FetchedResult result = fetch.fetch("ENTER URL");
    System.out.println(new String(result.getContent()));
} catch (BaseFetchException e) {
    e.printStackTrace();
}

该解决方案的缺点是Bixo有很多依赖关系-
因此这对每个人来说可能都不是一个好的解决方案。但是,您始终可以通过他们对DefaultHttpClient的使用来进行工作,并查看他们如何实例化它以使其正常工作。我决定使用整个类,因为它为我处理了一些事情,例如自动重定向跟踪(并报告最终的目标URL)很有用。

谢谢大家的帮助。

编辑:TinyBixo

大家好。因此,我喜欢Bixo的工作方式,但是不喜欢Bixo具有如此多的依赖关系(包括所有Hadoop)。因此,我创建了一个大大简化的Bixo,没有所有依赖项。如果您遇到上述问题,我建议您使用它(如果您想更新它,可以随时发出请求请求!)

它可以在这里找到:https :
//github.com/juliuss/TinyBixo


问题答案:

首先,回答您的问题:

连接重置是由服务器端的问题引起的。服务器很可能无法解析该请求或无法处理该请求,并因此在没有返回有效响应的情况下断开了连接。HttpClient生成的HTTP请求中可能导致服务器逻辑失败的原因可能是服务器错误。仅仅因为错误消息没有说“
by peer”,并不意味着连接重置发生在客户端。

几点评论:

(1)诸如bixo
http://openbixo.org/之类的几种流行的Web爬网程序使用HttpClient时没有出现重大问题,但是其中许多人不得不调整HttpClient的行为,以使其对常见的HTTP协议违规行为更加宽容。默认情况下,HttpClient在HTTP协议遵从性方面非常严格。

(2)为什么不向HttpClient项目报告NPE问题或您遇到的任何其他问题?



 类似资料:
  • 问题内容: 我在尝试从套接字读取时遇到以下错误。我正在执行该操作,并且出现此错误。仔细阅读文档,这表明连接的客户端部分关闭了连接。在这种情况下,我是服务器。 我可以访问客户端日志文件,但它没有关闭连接,实际上它的日志文件表明我正在关闭连接。有人知道为什么会这样吗?还有什么要检查的?当有本地资源可能达到阈值时,会出现这种情况吗? 我确实注意到我有以下几行: 就在readInt()。这是有原因的(长话

  • 问题内容: 我已经搜索了解决方案,但没有找到解决方案,但我总是遇到此错误 codigo: 错误: 问题答案: 从下载ChromeDriver http://chromedriver.storage.googleapis.com/index.html?path=2.33/ 此ChromeDriver可以与您的Google Chrome版本一起使用。

  • 问题内容: Netbeans IDE中的Java,Hibernate,MySQL项目中出现异常。 我做了一些挖掘工作,以尝试修复此奇怪的Socket异常,但无济于事。 一些论坛解决方案建议为Hibernate实现c3p0连接池。没有修复。 其他人建议禁用AV和防火墙(!!),因为它们可能会干扰套接字连接。没有修复。 我已经用Hibernate标记了这个问题,因为我不确定是休眠的原因,但是异常发生在

  • 我尝试通过应用服务器Glassfish和JPA连接到mysql数据库。 我的persistence.xml如下所示: mysql中的“max_connections”设置为600。这样就够了。 有什么问题?

  • 问题内容: 我们在日志中看到频繁但间歇的 错误。我们不确定错误的真正来源以及调试方法。 该问题似乎与我们尝试发送的消息无关。请注意,该消息不是 。 关于此异常的典型原因是什么以及如何进行的任何建议? 这是一个代表性的堆栈跟踪(是我们的组件): 我们的组件是一个在Tomcat下运行的Web应用程序,该应用程序调用发送SMS消息的第三方Web服务,这种情况经常发生。引发异常的代码行是下面的代码片段的最

  • 我们有一个复制设置,其中主节点,辅助节点和仲裁节点运行mongodb社区服务器v3.4.16。 我们正在使用jasperserver从mongoDB数据库生成100个报告。 最近,我们在连接到mongodb服务器时开始面临连接重置问题,因为报告会随机失败。 应用程序(jasperserver)和mongodb在同一个网络中,它们之间没有防火墙。 有人能提供任何指导来进一步调查根本原因,以便解决问题