当前位置: 首页 > 知识库问答 >
问题:

JavaSocketRead0问题

苗康平
2023-03-14

我正在用htmlunit开发一个web cralwer,我已经添加了所有必需的超时,但我注意到,当我使用Java VisualVM进行线程转储时,当某个已爬网网站的服务器没有响应时,应用程序会挂起:

java.lang.Thread.State: RUNNABLE
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(SocketInputStream.java:129)
at java.net.SocksSocketImpl.readSocksReply(SocksSocketImpl.java:88)
at java.net.SocksSocketImpl.connect(SocksSocketImpl.java:429)
at java.net.Socket.connect(Socket.java:525)
at com.gargoylesoftware.htmlunit.SocksSocketFactory.connectSocket(SocksSocketFactory.java:89)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148)
at org.apache.http.impl.conn.AbstractPoolEntry.open(AbstractPoolEntry.java:149)
at org.apache.http.impl.conn.AbstractPooledConnAdapter.open(AbstractPooledConnAdapter.java:121)
at org.apache.http.impl.client.DefaultRequestDirector.tryConnect(DefaultRequestDirector.java:573)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:425)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:776)
at com.gargoylesoftware.htmlunit.HttpWebConnection.getResponse(HttpWebConnection.java:152)
at app.plugin.core.net.QHttpWebConnection.getResponse(QHttpWebConnection.java:30)
at com.gargoylesoftware.htmlunit.WebClient.loadWebResponseFromWebConnection(WebClient.java:1439)
at com.gargoylesoftware.htmlunit.WebClient.loadWebResponse(WebClient.java:1358)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:307)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:373)
at com.gargoylesoftware.htmlunit.WebClient.getPage(WebClient.java:358)

这真的很令人沮丧,因为我无法控制那些服务器。这个问题严重影响了我的应用程序的性能。

问题:

  1. 我如何解决这个问题?
  2. 有没有办法得到一个Java应用程序打开的套接字连接列表,并使用它来终止套接字,比如模拟服务器关闭了连接?

共有3个答案

严柏
2023-03-14

如果您的Java服务器在Windows上,您的最后一招是SysInternals TCPView。

http://technet.microsoft.com/en-us/sysinternals/bb897437.aspx

从中,您将看到所有进程以及所有本地和远程端口的列表,其中包括您的Java应用程序。您必须选择正确的连接来关闭,然后Java线程将抛出异常并结束。

当然,有关闭错误连接的风险。毕竟,这种方法是最后的手段。

2019年8月23日更新:

当存在大量连接时,TCPView会变慢。

更快的替代方案是CurrPorts(来自NirSoft):https://www.nirsoft.net/utils/cports.html

莘羽
2023-03-14

以下是一篇可能与此相关的博文:http://javaeesupportpatterns.blogspot.fi/2011/04/javanetsocketinputstreamsocketread0.html

简而言之,解决方案是确保定义了套接字超时。默认值为0,表示没有超时。确切地说,这取决于库,在本例中显然是com。滴虫软件。htmlunit。快速一看,正确的方法可能是com。滴虫软件。是的。网络客户。设置超时。

锺离宸
2023-03-14

我相信,当您使用Java本机方法时,堆栈跟踪将显示RUNNABLE,即使调用实际上在等待某个事件时被阻止。本质上,我认为Java无法知道本机方法实际上在做什么,所以它会将这些调用标记为可运行。我已经在socketRead0()和socketAccept()中看到了这一点——这两个函数通常都会阻塞。

您需要将超时设置为合理的时间长度,这样,如果服务器没有响应,您的请求将超时,但如果服务器很忙,则不会太短。应用程序应该使用多线程编写。我会尝试运行十几个或更多线程,让每个线程等待最多五到十秒钟的响应。让几个线程等待几乎没有开销。在编写WebSpider时,还应注意不要用大量请求轰炸服务器。

 类似资料:
  • 问题内容: 包括: all Spring libs, Apache Tomcat 7.0 library 在构建路径中 但它仍然给出错误: 在“ org.sprintframework.web-3.1.0.M1.jar”中,我可以看到“ org.springframework.web.context.ContextLoaderListener”。 Google上的某个人说应该包含spring.ja

  • 问题内容: 我使用非常简单的代码返回XML 但是,出现以下错误 请帮忙。谢谢 问题答案: 运行时出现NoSuchMethodError表示你使用的库版本与生成代码所针对的版本不同。 在你的情况下,Spring是元凶。在运行时检查类路径上的内容,并确保以下各项: 版本与编译时间罐相同 如果存在多个版本,请删除不需要的版本

  • 问题内容: 我不明白注释和之间的实际区别是什么? 扩展名还是它们具有完全不同的含义?什么时候应该使用它们?在服务层中使用Spring ,在DAO 中使用javax? 谢谢回答。 问题答案: 几年前,Spring定义了自己的Transactional注释以使Spring bean方法具有事务性。 Java EE 7终于做了同样的事情,现在除了EJB方法外,还允许CDI bean方法是事务性的。因此,

  • 我在CentOS虚拟机中安装了RabbitMQ,该虚拟机的网络适配器被定义为Bridge。我正在尝试配置RabbitMQ管理,以便通过机器的IP地址访问WebApp。配置如下:

  • 这个FAQ的最新版本总是可以从Apache主站点得到,位于<http://httpd.apache.org/docs/2.2/faq/> 如果你的问题在这里没有找到答案,你也可以看看Apache 1.3 FAQ ,看你的问题是否在那里有了答案。 主题 背景 关于 Apache HTTP Server 的背景知识。 支持 我遇到问题该怎么办? 错误信息 这些错误信息是什么意思? 背景 什么是Apac

  • 发布问题 更新问题 设置问题悬赏 获取问题列表 获取一个问题详情 删除一个问题 获取用户发布的问题列表 发布问题 POST /questions 输入 字段 类型 描述 subject 字符串 必须,问题主题或者说标题,不能超过 255 字节 ,必须以 ? 结尾。(不区分全角或者半角) topics 数组 必须,绑定的话题,数组子节点必须符合 { "id": 1 } 的格式。 body 字符串