现在的位置: 首页 > 综合 > 正文

java编程中出现的几个异常

2018年02月09日 ⁄ 综合 ⁄ 共 4568字 ⁄ 字号 评论关闭

在运行一个爬虫程序时,出现了以下的异常:

异常一:

Exception in thread "main" org.apache.http.conn.HttpHostConnectException: Connection to http://www.******.com refused

at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:158)
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:754)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732)
at com.iw.crawl.monitor.UmengMain.getCookie(UmengMain.java:64)
at com.iw.crawl.monitor.UmengMain.login(UmengMain.java:85)
at com.iw.crawl.monitor.UmengMain.getAllExceptions(UmengMain.java:134)
at com.iw.crawl.monitor.UmengMain.main(UmengMain.java:206)
Caused by: java.net.ConnectException: Connection timed out: connect
at java.net.PlainSocketImpl.socketConnect(Native Method)
at java.net.PlainSocketImpl.doConnect(Unknown Source)
at java.net.PlainSocketImpl.connectToAddress(Unknown Source)
at java.net.PlainSocketImpl.connect(Unknown Source)
at java.net.SocksSocketImpl.connect(Unknown Source)
at java.net.Socket.connect(Unknown Source)
at org.apache.http.conn.scheme.PlainSocketFactory.connectSocket(PlainSocketFactory.java:123)
at org.apache.http.impl.conn.DefaultClientConnectionOperator.openConnection(DefaultClientConnectionOperator.java:148)
... 11 more
[db4o 8.0.184.15484   2011-10-29 13:07:44] 

 '******monitor-21150059878c14d1f25004c4-2011-10-29.db' closed by ShutdownHook.

异常二:

java.net.SocketException: Software caused connection abort: recv failed
at java.net.SocketInputStream.socketRead0(Native Method)
at java.net.SocketInputStream.read(Unknown Source)
at org.apache.http.impl.io.AbstractSessionInputBuffer.fillBuffer(AbstractSessionInputBuffer.java:149)
at org.apache.http.impl.io.SocketInputBuffer.fillBuffer(SocketInputBuffer.java:110)
at org.apache.http.impl.io.AbstractSessionInputBuffer.readLine(AbstractSessionInputBuffer.java:264)
at org.apache.http.impl.conn.DefaultResponseParser.parseHead(DefaultResponseParser.java:98)
at org.apache.http.impl.io.AbstractMessageParser.parse(AbstractMessageParser.java:252)
at org.apache.http.impl.AbstractHttpClientConnection.receiveResponseHeader(AbstractHttpClientConnection.java:281)
at org.apache.http.impl.conn.DefaultClientConnection.receiveResponseHeader(DefaultClientConnection.java:247)
at org.apache.http.impl.conn.AbstractClientConnAdapter.receiveResponseHeader(AbstractClientConnAdapter.java:219)
at org.apache.http.protocol.HttpRequestExecutor.doReceiveResponse(HttpRequestExecutor.java:298)
at org.apache.http.protocol.HttpRequestExecutor.execute(HttpRequestExecutor.java:125)
at org.apache.http.impl.client.DefaultRequestDirector.tryExecute(DefaultRequestDirector.java:645)
at org.apache.http.impl.client.DefaultRequestDirector.execute(DefaultRequestDirector.java:464)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:820)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:754)
at org.apache.http.impl.client.AbstractHttpClient.execute(AbstractHttpClient.java:732)
at com.iw.crawl.monitor.UmengMain.login(UmengMain.java:120)
at com.iw.crawl.monitor.UmengMain.getAllExceptions(UmengMain.java:134)
at com.iw.crawl.monitor.UmengMain.main(UmengMain.java:206

这个爬虫程序被我修改过,但是主要部分并没有做什么变化,在前几天的时候,程序的爬虫部分运行很正常。但是之后的两天,程序出现各种错误,其中以以上两个出现最多。在谷歌上做各种查询,其中报告比较多的是:

java.net.SocketException: Software caused connection abort:recv failed

产生这个异常的原因有多种方面,单就如 Software caused 所示, 
是由于程序编写的问题,而不是网络的问题引起的. 
已知会导致这种异常的一个场景如下: 
客户端和服务端建立tcp的短连接,每次客户端发送一次请求, 
服务端响应后关闭与客户端的连接. 
如果客户端在服务端关闭连接后,没有释放连接,继续试图发送请求和接收响应. 
这个时候就会出错. 
这个时候客户端Socket的getOutputStream返回来的OutPutStream维护 
的是本地的连接状态, 
无法知道远程的服务端已经关闭了对应的InputStream和socket因此 
虽然调用了 
out.write(sendbuf, 0, sendbuf.length); 
方法,但是实际上服务端并没有接收到客户端的请求信息. 
因为没有抛出异常,因此造成了误以为客户端请求发送成功的假象. 

接下来调用etInputStream的in.read(header, 0, 14);方法. 
因为这次要读取服务端的信息,因此产生了 
Software caused connection abort: recv failed的异常 

总结产生原因,在服务端/客户端单方面关闭连接的情况下,另一方依然以为 
tcp连接仍然建立,试图读取对方的响应数据,导致出现 
Software caused connection abort: recv failed的异常. 

因此在receive数据之前,要先判断连接状态. 
通过inputstream的available()方法来判断,是否有响应结果. 
如果available()的返回值为0,说明没有响应数据,可能是对方已经断开连接, 
如果available()的返回值大于0,说明有响应数据. 
另外值得注意的是available()返回的值是非堵塞的,可以被多个线程访问 

在对方释放连接后,也要释放本地的连接.


总结原因:应为客户端或者服务器端有一端已经关闭,而另一端则以为连接还在连的,在发送或接受请求的时候就会报这个错误。

抱歉!评论已关闭.