- android - 多次调用 OnPrimaryClipChangedListener
- android - 无法更新 RecyclerView 中的 TextView 字段
- android.database.CursorIndexOutOfBoundsException : Index 0 requested, 光标大小为 0
- android - 使用 AppCompat 时,我们是否需要明确指定其 UI 组件(Spinner、EditText)颜色
我正在创建一个(表现良好的)网络蜘蛛,我注意到某些服务器导致 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 在网络浏览器中加载良好。当我不使用 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 客户端中的一些关键功能。
有人知道是什么原因导致某些服务器出现此异常吗?
迄今为止的研究:
问题发生在我的本地 Mac 开发计算机和 AWS EC2 实例上,因此它不是本地防火墙。
看来错误不是由远程计算机引起的,因为异常没有显示“由同行”
这个堆栈溢出似乎是相关的 java.net.SocketException: Connection reset但答案并没有说明为什么这种情况只会发生在 Apache HTTP 客户端而不是其他方法中。
额外问题:我正在使用这个系统进行大量的爬行。除了 Apache HTTP Client 之外,通常还有更好的 Java 类吗?我发现了许多问题(例如我必须在上面的代码中捕获 NullPointerException)。看来 HTTPClient 对服务器通信非常挑剔 - 比我希望的爬虫程序更挑剔,因为爬虫程序不能在服务器不正常运行时就中断。
谢谢大家!
老实说,我没有完美的解决方案,但它确实有效,所以这对我来说已经足够了。
正如下面的 oleg 所指出的,Bixo 创建了一个爬虫,可以自定义 HttpClient,使其对服务器更加宽容。为了“解决”这个问题而不是解决它,我在这里使用了 Bixo 提供的 SimpleHttpFetcher:(链接已删除 - 所以认为我是垃圾邮件发送者,所以你必须自己用谷歌搜索)
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),这很有帮助。
感谢大家的帮助。
大家好。因此,我喜欢 Bixo 的工作方式,但不喜欢它有如此多的依赖项(包括所有 Hadoop)。因此,我创建了一个大大简化的 Bixo,没有所有依赖项。如果您遇到上述问题,我建议您使用它(如果您想更新它,请随时提出拉取请求!)
最佳答案
首先回答你的问题:
连接重置是由服务器端问题引起的。最有可能的是服务器无法解析请求或无法处理请求并因此断开连接而没有返回有效响应。 HttpClient 生成的 HTTP 请求中可能存在某些内容导致服务器端逻辑失败,这可能是由于服务器端错误所致。仅仅因为错误消息没有说“由对等方”并不意味着连接重置发生在客户端。
几点说明:
(1) bixo等几种流行的网络爬虫http://openbixo.org/使用 HttpClient 不会出现重大问题,但他们中的大多数都必须调整 HttpClient 行为,以使其对常见的 HTTP 协议(protocol)违规更加宽容。默认情况下,HttpClient 对 HTTP 协议(protocol)的遵从性相当严格。
(2) 为什么您没有向 HttpClient 项目报告 NPE 问题或您遇到的任何其他问题?
关于java - Apache HTTPClient 抛出 java.net.SocketException : Connection reset for many domains,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53274733/
在流处理方面,Apache Beam和Apache Kafka之间有什么区别? 我也试图掌握技术和程序上的差异。 请通过您的经验报告来帮助我理解。 最佳答案 Beam是一种API,它以一种统一的方式使
有点n00b的问题。 如果我使用 Apache Ignite 进行消息传递和事件处理,是否还需要使用 Kafka? 与 Ignite 相比,Kafka 基本上会给我哪些(如果有的话)额外功能? 提前致
Apache MetaModel 是一个数据访问框架,它为发现、探索和查询不同类型的数据源提供了一个通用接口(interface)。 Apache Drill 是一种无架构的 SQL 查询引擎,它通过
Tomcat是一个广泛使用的java web服务器,而Apache也是一个web服务器,它们在实际项目使用中有什么不同? 经过一些研究,我有了一个简单的想法,比如, Apache Tomcat Ja
既然简单地使用 Apache 就足以运行许多 Web 应用程序,那么人们何时以及为什么除了 Apache 之外还使用 Tomcat? 最佳答案 Apache Tomcat是一个网络服务器和 Java
我在某个 VPS( friend 的带 cPanel 的 apache 服务器)上有一个帐户,我在那里有一个 public_html 目录。我们有大约 5-6 个网站: /home/myusernam
我目前正在尝试将模块加载到 Apache,使用 cmake 构建。该模块称为 mod_mapcache。它已成功构建并正确安装在/usr/lib/apache2/modules directroy 中
我对 url 中的问号有疑问。 例如:我有 url test.com/controller/action/part_1%3Fpart_2 (其中 %3F 是 url 编码的问号),并使用此重写规则:R
在同一台机器上,Apache 在端口 80 上运行,Tomcat 在端口 8080 上运行。 Apache 包括 html;css;js;文件并调用 tomcat 服务。 基本上 exampledom
Apache 1 和 Apache 2 的分支有什么区别? 使用一种或另一种的优点和缺点? 似乎 Apache 2 的缺点之一是使用大量内存,但也许它处理请求的速度更快? 最有趣的是 Apache 作
实际上,我们正在使用 Apache 网络服务器来托管我们的 REST-API。 脚本是用 Lua 编写的,并使用 mod-lua 映射。 例如来自 httpd.conf 的实际片段: [...] Lu
我在 apache 上的 ubuntu 中有一个虚拟主机,这不是我的主要配置,我有另一个网页作为我的主要网页,所以我想使用虚拟主机在同一个 IP 上设置这个。 urologyexpert.mx 是我的
我使用 Apache camel 已经很长时间了,发现它是满足各种系统集成相关业务需求的绝佳解决方案。但是几年前我遇到了 Apache Nifi 解决方案。经过一番谷歌搜索后,我发现虽然 Nifi 可
由于两者都是一次处理事件的流框架,这两种技术/流框架之间的核心架构差异是什么? 此外,在哪些特定用例中,一个比另一个更合适? 最佳答案 正如您所提到的,两者都是实时内存计算的流式平台。但是当您仔细观察
apache 文件(如 httpd.conf 和虚拟主机)中使用的语言名称是什么,例如 # Ensure that Apache listens on port 80 Listen 80 D
作为我学习过程的一部分,我认为如果我扩展更多关于 apache 的知识会很好。我有几个问题,虽然我知道有些内容可能需要相当冗长的解释,但我希望您能提供一个概述,以便我知道去哪里寻找。 (最好引用 mo
关闭。这个问题是opinion-based .它目前不接受答案。 想改善这个问题吗?更新问题,以便可以通过 editing this post 用事实和引文回答问题. 4 个月前关闭。 Improve
就目前而言,这个问题不适合我们的问答形式。我们希望答案得到事实、引用或专业知识的支持,但这个问题可能会引起辩论、争论、投票或扩展讨论。如果您觉得这个问题可以改进并可能重新打开,visit the he
这个问题在这里已经有了答案: Difference Between Apache Kafka and Camel (Broker vs Integration) (4 个回答) 3年前关闭。 据我所知
我有 2 个使用相同规则的子域,如下所示: RewriteEngine On RewriteCond %{REQUEST_FILENAME} !-f RewriteCond
我是一名优秀的程序员,十分优秀!