java.net.SocketException: Connection reset 解决方法_java

自从SEOTcs系统11月份24日更新了一下SEO得分算法以来,一直困扰我的一个问题出现了,java的数据job任务,在执行过程中会经常报以下的错误:

“2011-12-03 18:00:32 DefaultHttpClient [INFO] I/O exception (java.net.SocketException) caught when processing request: Connection reset by peer: socket write error
2011-12-03 18:00:32 DefaultHttpClient [INFO] Retrying request”…

为此,我找遍了中英文的一些网站,搜遍了能找的每个角落,发现了出现这种状况的原理,该java异常在客户端和服务器端都有可能发生,引起该异常的原因有两个:

1,如果一端的Socket被关闭(或主动关闭,或因为异常退出而 引起的关闭),另一端仍发送数据,发送的第一个数据包引发该异常(Connect reset by peer)。

2,一端退出,但退出时并未关闭该连接,另一端如果在从连接中读数据则抛出该异常(Connection reset)。简单的说就是在连接断开后的读和写操作引起的。

于是我简单的认为通过设置一些socket的timeout时间,就能解决:

但是设置以后情况依然是那样。

这个问题困扰了好几天,每天都在思考和对比测试中,以求发现造成这个原因代码的地方,我不禁思考,同样数量的关键词数量前提下,为什么之前批量查询排名数据没有出错,而最近会频繁报错,这到底是为什么?是被请求的接口网站屏蔽掉了我们的服务器ip?这个理由也不是很充分,肯定是程序中某个地方没有合理释放掉connection的连接导致!

在这个思路的指引下,通过几天连续的奋战和实践,今天终于发现了问题的本质,那就是那个timer的方法导致的!情况是这样的,这几天,我在手动触发一些批量任务,发现在过滤排名值为100的情况下,java的java.net.SocketException: Connection reset 这个错会一直抛出,而且刷屏特别厉害,在仔细对照了timer的这段代码


 

后,终于猛然醒悟,对!就是这里出问题了,我自己来分析一下:

一个函数值,它返回的值,是一个临界值,但是我这个timer的方法中,判断了返回的值如果是临界值的话,会迫使它在10秒内继续执行那个方法,而这个方法是要去获取一个页面中源代码的一个特定数据,每次这个方法执行会消耗掉几十毫秒的时间,即相当于在这个时间内,是建立了一个socket连接,但是由于它一直返回的是那个临界值,所以这个方法会在10秒内不停的建立socket连接以获取数据,如果这个方法每次执行时间大概是80ms(经过测试,每个这样的方法执行时间为80毫秒左右),在10秒时间内,会建立10*1000/80 = 125次socket连接,即每秒会建立起12.5个socket连接,再加上由于这个是过滤的程序,多个临界值的情况会连续出现在一起,所以,在短暂的几秒钟内,对同一个网站页面的socket连接数会飙升的很高,达到几百甚至上千,导致等待处理的请求连接数太高:

当初为什么会用这个定时器方法来让一个方法多执行几遍,原因就是为了获取一个数据的稳定值,但是现在想来,带来的负面影响代价是多么的大,产生的效果是不可小觑的,不过经过几天的综合分析和测试,终于还是发现了这个罪魁祸首,问题解决后,心,一下子豁然了,可以安心睡觉了。。。

时间: 2024-08-31 06:59:04

java.net.SocketException: Connection reset 解决方法_java的相关文章

服务器-java.net.SocketException: Connection reset时出时不出

问题描述 java.net.SocketException: Connection reset时出时不出 最近写一个很简单的TCP通信的程序,问题的详细情况是这样的:服务器端在电脑上,客户端在android手机上,android手机连上学校里的无线可以正常连接.现在我用运行着服务器端的电脑上的360免费wifi开无线,android手机连上电脑开的这个无线再进行连接的时候就会抛出java.net.SocketException: Connection reset的错误!为什么呢?难道是TCP通信

java.net.SocketException: Connection reset

问题描述 java.net.SocketException:Connectionresetatjava.net.SocketInputStream.read(SocketInputStream.java:168)atsun.nio.cs.StreamDecoder.readBytes(StreamDecoder.java:264)atsun.nio.cs.StreamDecoder.implRead(StreamDecoder.java:306)atsun.nio.cs.StreamDecode

Caused by: java.net.SocketException: Connection reset能有什么原因?

问题描述 前台java调后台C++时报错,请各位帮忙看看.能有什么原因. 解决方案 解决方案二:该回复于2009-08-28 13:35:41被版主删除

java.net.ConnectException: Connection refused问题解决办法_java

Socket异常 客户端异常 java.net.ConnectException: Connection refused: connect. 该异常发生在客户端进行new Socket(ip, port)操作时,该异常发生的原因是或者具有ip地址的机器不能找到(也就是说从当前机器不存在到指定ip路由),或者是该ip存在,但找不到指定的端口进行监听.出现该问题,首先检查客户端的ip和port是否写错了,如果正确则从客户端ping一下服务器看是否能ping通,如果能ping通(服务服务器端把ping

Tomcat的SEVERE: Remote Host / SocketException: Connection reset原因分析及解决办法

昨天在测试帮助文件时发现一直打不开,好像是一直再刷新,于是就到服务器上查看Tomcat的日志,就发现了下面的信息:Apr 21, 2008 9:27:34 AM org.apache.tomcat.util.net.TcpWorkerThread runItSEVERE: Remote Host /172.16.128.248 SocketException: Connection reset并且这两条信息几乎是每个1-2秒就出现一次,很是频繁.于是就搜索了一下,就找到了下面的内容:The us

java连接mysql数据库乱码的解决方法_java

解决方法一: mysql安装时候的编码, 看下my.ini,有无 复制代码 代码如下: [mysql] default-character-set=utf8 [client] default-character-set=utf8 [mysqld] default-character-set=utf8创建表的时候设置: DROP TABLE IF EXISTS `Company`; CREATE TABLE IF NOT EXISTS `Company` ( `Cname` VARCHAR(10)

java使用Jsoup连接网站超时的解决方法_java

今天做了一个Jsoup解析网站的项目,使用Jsoup.connect(url).get()连接某网站时偶尔会出现java.net.SocketTimeoutException:Read timed out异常.原因是默认的Socket的延时比较短,而有些网站的响应速度比较慢,所以会发生超时的情况. 解决方法: 链接的时候设定超时时间即可.doc = Jsoup.connect(url).timeout(5000).get();5000表示延时时间设置为5s. 测试代码如下:1,不设定timeou

Java读取properties配置文件时,出现中文乱码的解决方法_java

如下所示: public static String getConfig(String key) { Properties pros = new Properties(); String value = ""; try { pros.load(new InputStreamReader(Object.class.getResourceAsStream("/properties.properties"), "UTF-8")); value = pr

java 页面url传值中文乱码的解决方法_java

中文问题,是在应用中常常遇到的问题. 这将涉及到字符解码操作,我们在应用中常常会用new String(fieldType.getBytes("iso-8859-1"), "UTF-8");等类似的方法去解码.但这种方式受具体应用环境限制,往往在应用部署环境发生改变时,还会出现中文乱码. 在这里介绍一种解决方法,可以在任何应用部署环境下通用.此方法分两步: 1.在客户端用escape(encodeURIComponent(fieldValue))方法编码,例如: 复